- TLV는 "Tag-Length-Value"의 약자로,
데이터의 구조를 세 가지 구성 요소로 구분하는 형식입니다.
이 형식은 주로 통신 프로토콜에서 데이터를 효율적으로 전송하고,
각 데이터의 의미를 명확히 하기 위해 사용됩니다.
Tag: 데이터 항목의 종류나 속성을 나타내는 식별자입니다.
Length: 데이터 값의 길이를 나타내며, 몇 바이트로 이루어졌는지를 표현합니다.
Value: 실제 데이터 값 자체입니다.
예를 들어, 특정 메시지가 Tag=01, Length=04, Value=1234로 구성되어 있다면,
Tag는 데이터의 종류를, Length는 값이 4바이트라는 것을, Value는 실제 데이터가 "1234"임을 의미합니다.
TLV 구조는 특히 비동기 데이터 처리나 다양한 데이터 유형을 처리할 때 유용합니다.
- 프로토콜 설계
TLV 를 받을 때, Hex 값으로 된 String 을 받는다고 하겠습니다.
(예시 : 850105435056303161025A4F0307D41000000140105704139200779000001352D2
0106017700000000000F5F340102)
여기서는 Tag 를 2Byte, Length 를 1Byte 로 보내준다고 약속할 것입니다.
- Java TLV 해석 함수 설계
Java 에서 TLV Hex String 을 받아서 이를 Tag-Value 의 Map 으로 반환하는 함수를 만들 것입니다.
인터페이스는
Map<String, String> parseTlvToTvMap(String tlvString);
입니다.
- Java 구현
구현에 앞서, String tlvString 에 대해 먼저 알아봅시다.
"850105435056303161025A4F0307D41000000140105704139200779000001352D201060177000000000000F5F340102"
위와 같이 입력되었다 할 때, 위의 값은 Hex(16진수) 숫자를 나타낸 String 이라고 했는데,
"010001010001011110101010000"
위와 같은 Binary(2진수) 숫자를 나타낸 String 이 1 Byte 에 8개의 글자를 포함한다고 하면,
Hex String 은 1 Byte 에 2 개의 글자를 포함합니다.
(10 진수로 15 에 해당하는 값은 2진수로 1111 이며, 16진수로는 F 이므로, 한 글자에 bit 가 4개로 표현되므로 16진수의 한 글자는 4비트, 2 글자는 8 비트로, 1 Byte 가 됨)
tlvString 은 앞에서부터 해석을 시작하며, tlv 가 여러개 들어있을 수 있습니다.
예를들어 가장 앞의 2Byte 에 해당하는 4 글자가 tag, 뒤의 1 Byte 인 2 글자가 Length 라고 할 때,
처음에는 tag = 2, Length = 3 이라고 나오면, 다음에 나오는 3 Byte 는 Value 가 되며,
Value 뒤에서부터 다시 tag - length - value 가 반복됩니다.
public static Map<String, String> parseTlvToTvMap(String tlvString) {
// Tag, Length 의 Byte 설정
int tagByte = 2;
int lengthByte = 1;
// 1 Byte 에 HexString 이 2개가 사용되므로 길이 계산
int tagHexSize = tagByte * 2;
int lengthHexSize = lengthByte * 2;
Map<String, String> result = new HashMap<>();
int curIndex = 0;
// 현재 탐색 인덱스가 tlvString 전체 길이를 넘어갈 때까지 반복
while (curIndex < tlvString.length()) {
// Tag 추출
String tag = tlvString.substring(curIndex, curIndex + tagHexSize);
curIndex += tagHexSize; // 탐색 인덱스 이동
// Length 추출
String lengthHex = tlvString.substring(curIndex, curIndex + lengthHexSize);
curIndex += lengthHexSize; // 탐색 인덱스 이동
int length = Integer.parseInt(lengthHex, 16);
// Value 추출
String value = tlvString.substring(curIndex, curIndex + length * 2);
curIndex += length * 2; // 탐색 인덱스 이동
// result Map 에 저장
result.put(tag, value);
}
return result;
}
위와 같은 지식을 바탕으로 이처럼 작성할 수 있습니다.
'Programming Language' 카테고리의 다른 글
[Java] JVM Garbage Collector 정리 (2) | 2024.10.13 |
---|---|
[Java] 자바 Thread Dump 개인정리 (0) | 2024.10.13 |
[Java] JNI 정리 및 개발 방식 정리 (2) | 2024.10.13 |
[Java] 자바를 사용한 병렬 프로그래밍 정리와 synchronized, volatile 설명 (0) | 2024.10.13 |
JVM 메모리 누수 방지를 위한 체크사항 (5) | 2024.09.29 |