본문으로 바로가기

Tcl의 바이너리

category 카테고리 없음 2025. 8. 8. 22:34

https://blog.it-see.net/it-dokata/tcl-tk/binary-operetion2/

 

Tcl 8.0부터 바이너리 데이터를 조작하기 위한 binary 커맨드가 추가되었습니다. binary 커맨드를 사용하면 문자열과 바이너리 데이터 간의 상호 변환이 가능합니다.

바이너리 변환

binary format은 formatString으로 지정한 형식에 따라 arg로 지정한 문자열을 바이너리 데이터로 변환하여 반환합니다.

binary format formatString ?arg arg ...?

아래는 formatString 예시입니다.

$ binary fomat a3a2 Good morning!
Goomo

formatString으로 "a3″과 "a2″ 두 개의 필드가 지정되어 있고, 해당 값은 "Good"과 "morning!"의 두 가지 값이 지정되어 있습니다. 필드의 첫 번째 문자는 변환 방법을 나타내는 타입입니다. 그 뒤의 숫자는 변환을 반복할 횟수를 나타냅니다. 숫자 대신 "*"를 사용하면 해당 arg의 모든 문자열을 변환합니다. "a" 타입은 arg 문자열의 count 자릿수만큼의 바이너리 데이터로 변환하여 반환합니다. 예제의 경우, Goo의 3글자와 mo의 2글자를 바이너리 데이터로 변환하여 반환합니다.

 

Goomo의 문자를 16진수로 표현하면 다음과 같습니다.

47 6f 6f 6d 6f
G  o  o  m  o

따라서 \x47\x6f\x6f\x6d\x6f 의 바이너리 값이 반환 됩니다. 위의 예는 아스키코드 범위 내의 문자이므로 변환 후에도 문자로 보이지만, 한글 등 아스키코드 범위를 벗어난 문자인 경우 반환된 바이너리 데이터는 깨져 보일 것입니다.

 

타입으로 지정할 수 있는 종류는 다음과 같습니다.

a

문자열 arg를 count 자릿수만큼 바이너리 값으로 변환합니다. arg가 count보다 작으면 00으로 채워지고, count보다 크면 반올림되며, count를 생략하면 한 글자씩 변환되고, count가 "*"이면 모두 변환됩니다.

$ binary format a8 Hello!
Hello!

위의 경우 \x48\x65\x6c\x6c\x6c\x6f\x21\x00\x00 의 바이너리 값이 반환됩니다.

\x48\x65\x6c\x6c\x6c\x6f\x21\x00\x00 
Hello!

A

arg가 count보다 작으면 공백으로 채워지며, 그 외에는 a와 동일합니다.

$ binary format a8 Hello!
Hello!

위의 경우 \x48\x65\x6c\x6c\x6c\x6f\x21\x20\x20 의 바이너리 값이 반환됩니다.

\x48\x65\x6c\x6c\x6c\x6f\x21\x20\x20 
Hello!공백공백

 

b

2진수로 표기된 문자열을 count 자릿수만큼 low-to-high 순서의 바이트 단위로 변환합니다. arg는 "1″과 "0″으로 지정하며, arg가 count보다 작으면 나머지 비트는 0으로 채워지고, count보다 크면 반올림되며, count를 생략하면 1비트만 출력합니다. 또한 count가 "*"인 경우 모두 출력됩니다. 출력된 비트 수가 바이트 단위로 끝나지 않으면 나머지 비트는 0으로 채워집니다.

$ binary format b8b* 110010 011100110101 
\x13\xce\x0a

B

비트가 각 바이트 내에서 high-to-low 순서로 변환된다는 점을 제외하면 b와 동일합니다.

$ binary format B8B* 110010 011100110101 
\xc8\x73\x50

h

16진수로 표기된 문자열을 count 자릿수만큼 low-to-high 순서의 바이트 단위로 변환합니다. arg는 '0123456789abcdefABCDEF'로 지정합니다. 변환되는 바이너리 값은 arg에서 지정한 두 개의 16진수 표기 문자에서 바이트 값을 구하고, 바이트 내 하위에서 low-to-high 순서로출력됩니다. arg의 자릿수가 count보다 작으면 나머지 자릿수에 0이 사용되며, arg가 지정된 자릿수보다 크면 초과된 자릿수는 무시되고, count가 *인 경우 arg의 모든 숫자가 변환됩니다. 변환된 숫자가 바이트 단위로 끝나지 않으면 나머지 4비트는 0이 되며, count가 생략된 경우 1자리가 변환됩니다.

$ binary format h3h* AB def 
\xba\x00\xed\x0f

$ binary format h AB
\x0a

H

바이트 내에서 상위에서 하위(high-to-low) 순서로 출력된다는 점을 제외하면 h와 동일합니다.

$ binary format h3h* AB def
\xab\x00\xde\xf0

$ binary format h AB
\xa0

C

하나 이상의 8비트 정수 값을 변환합니다. arg는 정수 값으로 지정해야합니다. count가 지정되지 않은 경우 arg는 하나의 정수 값이어야 하며, count가 지정되어 있는 경우 arg는 그 수의 리스트로 지정합니다. 각 요소의 하위 8비트가 1바이트의 바이너리 값으로 출력됩니다. count가 "*" 인 경우 모든 요소가 변환되며, 리스트의 요소 수가 count보다 크면, 초과된 요소는 무시됩니다. 리스트의 요소 수가 count보다 작으면 에러가 발생합니다.

$ binary format c3cc* {3 -3 128 1} 260 {2 5}
\x03\xfd\x80\x04\x02\x05

$ binary format c {2 5}
expected integer but got "2 5"

$ binary fomat c3 {2 5}
number of elements in list does not match count