행복한 하루

[Python] 정수를 16진수(HEX)로 몇 가지 출력(표현)하는 방법 본문

Programming/Python

[Python] 정수를 16진수(HEX)로 몇 가지 출력(표현)하는 방법

변화의 물결 2023. 6. 22. 00:05

 

 

안녕하세요.

 

 시리얼(UART) 통신을 하다 보면 HEX(16진수) 데이터를 많이 보게 됩니다. 그런데 python에서 화면에 표시하려면 생각한 것처럼 예쁘게 나오지 않습니다. 그래서 간단하게 알고 있으면 좋을 내용이 있어서 적어보았습니다.

 

 기본적으로 Hex라고 하면 0x00~ 0xFF로 표기가 됩니다. 그러나 0x를 뺄 수도 있고, 00 두 자리로 표시할 수도 있고 대문자로도 할 수 있고 정의하는 곳에 맞게 출력할 필요가 있습니다. 그래서 맞는 옵션을 찾아서 출력설정을 하면 도움이 될 거라고 생각됩니다. 그리고 MicroPython에서 바로 지원하지 않는 함수도 있을 수 있으니 개발 환경에서 작동하는지 확인이 필요해 보입니다.


1. 변환 함수로 10진수 -> 16진수(HEX) 변환

- hex(정수) 함수를 넣으면 Hex로 출력됩니다.

print("HEX print : ", hex(1), " ", hex(255))

2. format함수 이용

- format(정수, 형식)에서 형식에 x는 16진수 표시를 하는 것이고 2는 간격을 주는 것입니다. 만약 02를 넣어주면 빈칸에는 0이 입력됩니다. (참고로, o는 8진수, b는 2진수, #을 붙이면 접두어 포함) 

print("HEX print : ", format(1, 'x'), " ", format(255, 'x') )
print("HEX print : ", format(1,'2x'), " ", format(255, '2x') )
print("HEX print : ", format(1,'02x'), " ", format(255, '02x') )

 - 앞에 0x 표기가 빠져 있는데 여기에 #을 붙여주면 앞에 문자가 붙게 됩니다.  사용법 중 ‘X’에 보면 나와 있습니다. (다른 블로그 내용에는 #을 format specification mini language라고 합니다) 그런데 그렇게 되면 간격에 0을 붙이는 것이 작동하지 않는 것처럼 보일 수 있습니다. 그것이 아니라 0x로 인해 자릿수가 4개가 되는 것입니다.  4로 바꿔 주면 0의 자리도 포함되는 것을 알 수 있습니다. 그리고 x는 소문자로, X는 대문자로 표시해줍니다. 

print("HEX print : ", format(1, '#02 x'), " ", format(255, '#02 x') )
print("HEX print : ", format(1, '#02 X'), " ", format(255, '#02 X') )

print("HEX print : ", format(1, '#04 x'), " ", format(255, '#04 x') )
print("HEX print : ", format(1, '#04 X'), " ", format(255, '#04 X') )

3. 문자열 포맷형태 이용

 - 위의 내용과 크게 차이는 없지만, 문자열 중간에 넣어 사용할 때 편하게 사용할 수 있습니다. 위의 내용도 비슷하게는 가능합니다. 그런데 여기서 주의 깊게 봐야 하는 것이 동일한 두 문장 같지만, 아래의 예제에서 ex1는 f-string 문법으로 문자열 안에 함수도 넣을 수 있는 다른 기능의 문자열이 됩니다. 그래서 .format에 있는 인자가 들어가는 것이 아니라, {정수, 형식}으로 동작하는 것을 알 수 있습니다.  f-string은 다른 내용이라 여기서는 넘어가도록 하겠습니다.

 

 - ex2는 우리가 예상하는 문자열{인자인덱스:형태} 안에 .format(정수, 정수... ) 형태인 인자가 인덱스에 맞는 정수가 대입되는 것을 볼 수 있습니다. 

print(f"HEX print : first - {0:#04x} end - {1:#04x}".format(2, 255))  #ex1 : f-string
print("HEX print : first - {0:#04x} end - {1:#04x}".format(2, 255))  #ex2

4. 간단하게 배열내용을 출력

 - 정수값을 리스트 입력해서 아래와 같이 간단하게 출력해 볼 수 있습니다. 

data = [1, 2, 3, 0xFF]

for c in data:
    print("HEX :", "{0:#04X} {1:#04X}".format(c, 255) ,f"f-string : {c:#04X}")

 - 필요에 맞게 원하는 형태로 HEX 값을 출력해서 사용하는데 도움이 되었으면 합니다.

 

 

감사합니다.

 

 

<참고 사이트>

1. 파이썬 format(), 16진수 변환, hex 값 변환

https://cyber0946.tistory.com/76 

2. Python Int to Hex | String Formatting

https://blog.finxter.com/python-int-to-hex-string-formatting/

3. string — Common string operations

https://docs.python.org/3/library/string.html

4. 파이썬의 f-string으로 문자열 포맷팅하기

https://www.daleseo.com/python-f-strings/

 

Comments