TLV 포멧

TLV 포멧

생성일
Oct 14, 2024 06:12 PM
최종 편집 일시
Last updated October 15, 2024
태그
CS

TLV란?

Tag Length Value의 약자이다.
구조화된 3개의 필드 요소(T, L, V)로 구성된 이기종 시스템 상호간 통신을 위한 데이터 포멧이다.
인코딩 방법에는 BER(Basic Encoding Rules), DER(Distinguished Encoding Rules), CER(Canonical Encoding Rules) 등이 있고 이들 간에는 큰 차이가 없다고 한다.
 

파싱 해보기

예를 들어 입력값으로 16진수 문자열이 주어진다고 해보자.
16진수의 각 자리수는 4비트이기 때문에 두글자가 1바이트이다.
3F0A0B0123456789101112131415
와 같은 문자열이 주어진다면
3F 0A 0B 01 23 45 67 89 10 11 12 13 14 15의 총 14 바이트로 이루어져있음을 알 수 있다.
 
  1. TAG 구하는 방법
    1. notion image
      • 보통은 첫 1바이트가 Tag가 된다.
      • 그런데 이미지를 보면 b6이 0인지 1인지에 따라 Primitive, Constructed인지가 나뉜다.
      • 예로 주어진 문자열의 1바이트에 해당하는 것음 3F이다.
      • 이를 2진수로 변환하면 00111111이다.
      • 이미지와 대조해보면 왼쪽에서 3번째 비트가 1이므로 이 데이터는 Constructed data object이다.
      • Primitive는 TLV 한 줄 그대로 출력되는 형태
      • Constructed는 TL은 그대로이지만 V가 또 하나의 TLV 구조가 되는 형태다.
      • 맨 뒤가 11111이기 때문에 subsequent bytes를 봐야 한다.
      • 이러면 다음 1바이트도 태그에 포함된다.
        • notion image
      • 다음 1바이트는 0A다. 이는 이진수로 00001010이다.
      • 위 이미지를 보면 가장 왼쪽의 비트가 이게 마지막 태그인지 아닌지를 알려준다.
      • 0A의 경우에는 이 두번째 바이트가 태그의 마지막이라는 것을 알 수 있다.
      • 따라서 예시 문자열에서 Tag는 3F0A가 된다.
  1. Length 구하기
      • Length는 Tag 다음 1바이트이다.
      • 따라서 Length는 0B이다.
  1. Value 구하기
      • value는 length의 길이 만큼 잘라낸 값이 된다.
      • length가 0B이므로 이를 10진수로 변환하면 00001101 → 11이다.
      • 따라서 11바이트라는 것을 알 수 있다.
      • 전체 문자열에서 Tag와 Length (3F0A, 0B)를 잘라낸 나머지 문자열 012345678101112131415 를 11바이트만큼 잘라낸다.
      • 01 23 45 67 89 10 11 12 13 14 15
      • 이게 Value가 된다.
  1. 마지막 출력 값
      • 만약 이 문자열이 Primitive 타입이었으면
      • T L V
      • 3F0A 0B 0123456789101112131415
      • 이렇게 표현해주면 끝이지만
      • 아쉽게도 Constructed data Object이기 때문에 0123456789101112131415 도 TLV 구조이다.
      • 이를 또 분석해보면
      • 처음 1바이트는 01 이다. 00000001
      • 왼쪽에서 3번째 비트가 0이므로 Primitive 타입이다.
      • 따라서 01이 태그다.
      • 그 다음 1바이트가 Length 이므로 23이 Length다. 23은 00100011 이다.
      • 따라서 뒤의 35 바이트가 Value가 된다.
      • 45 67 89 10 11 12 13 14 15… 가 Value다.