본문으로 바로가기

Python String to Hex 변환

category 프로그래밍 2019.01.13 22:12

개발할 때 종종 String to Hexa로 변환하여 출력하는 경우가 꽤 있다.

파이썬 3.x 버전에서는 인코딩 관련해서 문제가 거의 없다고 하지만, 파이썬 2.7 버전에서는 많은 문제를 내포하고 있어 아래 관련 자료를 참고하면 좋을 것이다.


파이썬 2.7 버전에서 unicode string을 선언하려면 아래와 같이 문자열 앞에 u가 붙어야 한다.

# -*- coding: utf-8 -*-
string = u"Tigo o ponte al día con el pago de tus facturas"

첫 줄의 주석(# -*- coding: utf-8 -*-)은 파이썬 파일에 대한 인코딩 방식을 지정하는 것이다. ascii 형식이 아닌 문자가 파이썬 파일에 포함될 경우 인코딩 방식을 설정하여 저장하지 않으면 실행 에러가 발생한다.


위의 String을 Hex로 변경하기 위해 우선 문자열을 인코딩하여 Hex로 변경하는 과정을 거쳐야 한다. 파이썬은 기본적으로 unicode 형식으로 저장되기 때문에 unicode에서 다른 characterset으로 변경할 때는 encode() 함수를 사용하고, 반대로 unicode를 제외한 characterset에서 unicode로 변경할 경우에는 decode() 함수를 사용한다.


하기 코드는 unicode에서 변경하고자 하는 characterset(utf-8)로 변경하고 그것을 다시 hex 형식으로 변경한 결과를 리스트로 반환 하는 방법을 나타낸다.

h_list = ["0x{:02X}".format(ord(x)) for x in string]
c_list = [x.encode("utf-8").encode("hex") for x in string]

c_list / h_list 모두 String을 Hex로 변경하여 리스트로 저장한 것인데, 출력 형식을 바꾼 차이가 있다. h_list는 value 앞에 0x를 붙여 출력 형식을 변경한 것이고, c_list는 value를 그대로 출력하여 리스트로 저장한 것이다.


위의 내용을 바탕으로 Spanish String을 Hex list로 변환하는 코드는 아래와 같이 간단히 작성할 수 있다.

# -*- coding: utf-8 -*-
import sys

print "String = " + sys.argv[1] + "\n"
string = sys.argv[1].decode("utf-8")
h_list = ['0x50', '0x20'] + ["0x{:02X}".format(ord(x)) for x in string]
i = 0
for hexa in h_list:
	print hexa + ",",
	if (i % 0x10) == 0x0F:
		print ""
	i = i + 1

가끔 특정 언어를 Hex 배열로 변환해서 사용할 일이 생기는데, 매번 이것을 C로 하는 것이 귀찮아 파이썬 본 김에 간단하게 스크립트를 만들어 보았다. String은 입력 아규먼트로 설정하여 스크립트는 더 이상 수정 없이 아래와 같이 String 값만 변경해서 실행하면 String에 대해나 Hex 리스트를 얻을 수 있다.

아직은 파이썬이 익숙치 않아서 코딩하는데 시간이 걸리지만, 조금씩 나아질 것이라고 생각한다. 오늘 시간나서 한번 훑어 봤지만 스크립트는 쉬운듯 하면서 어렵다. -.-;;


파이썬 3.x 버전으로 다시 작성하였다. 그동안 파이썬 2.7 버전을 사용하였는데, 두 버전 간 다소 차이가 있어 파이썬 3.x 버전으로 작업 하는 것이 좋을 것 같아 파이썬 3.x 버전으로 앞으로 코딩할 예정이다.

string = "Tigo o ponte al día con el pago de tus facturas"
hexa_list = ["0x50", "0x20"] + ["0x{:02X}".format(ord(x)) for x in string]
for i, x in enumerate(hexa_list):
	print(x, end=", ")
	if i % 0x10 == 0x0F:
		print()
print()

파이썬 3.x 버전을 사용하면 구 버전에서 머리를 아프게 했던 characterset 인코딩 문제는 해방이 되는 듯 하다.


'프로그래밍' 카테고리의 다른 글

Python List Comprehension  (0) 2019.01.17
Python String to Hex 변환  (0) 2019.01.13
Visual Studio Code - Python 설정  (0) 2019.01.08