프로그래밍/Python

[python] int를 byte로 변환하는 방법 (how to convert int to bytes)

채윤아빠 2021. 5. 12. 09:19
728x90
반응형

int를 byte로 변환하는 방법

크게 두 가지가 방법이 있습니다.

첫 번째는 to_bytes() 함수를 이용하는 방법입니다. 사용 방법은 다음과 같습니다.

print('to_bytes()')
print((258).to_bytes(2, byteorder="little"))
print((258).to_bytes(2, byteorder="big"))
print((258).to_bytes(4, byteorder="little", signed=True))
#print((-258).to_bytes(4, byteorder="little", signed=False))
#OverflowError: can't convert negative int to unsigned
print((-258000).to_bytes(4, byteorder="little", signed=True))
print((-258000).to_bytes(4, byteorder="big", signed=True))

""" result =>
to_bytes()
b'\x02\x01'
b'\x01\x02'
b'\x02\x01\x00\x00'
b'0\x10\xfc\xff'
b'\xff\xfc\x100'
"""

두 번째는 struct.pack() 함수를 이용하는 방법입니다. 사용 방법은 다음과 같습니다.

print('struct.pack()')
print(struct.pack('<h', 258))
print(struct.pack('>h', 258))
print(struct.pack('<i', 258))
#print(struct.pack('<I', -258000))
#struct.error: argument out of range
print(struct.pack('<i', -258000))
print(struct.pack('>i', -258000))
""" result =>
struct.pack()
b'\x02\x01'
b'\x01\x02'
b'\x02\x01\x00\x00'
b'0\x10\xfc\xff'
b'\xff\xfc\x100'
"""

성능 비교

to_bytes() 함수를 이용하는 방법이 별도의 패키지를 import 하지 않아도 사용할 수 있는 손쉬운 방법이긴 하나, 성능에 차이가 있습니다.

to_bytes() 함수는 이용이 손쉽고 조금 더 직관적이기는 하지만, 성능이 가장 느린 함수로, 오로지 int를 bytes로 변환할 경우라면, struct pack() 함수를 이용하는 것이 성능상으로는 가장 좋습니다.

다음과 같이 "timeit"을 이용하여 두 함수의 성능을 비교하는 코드를 작성하여 실행해 보았습니다.

import timeit

result = timeit.timeit('struct.pack("<H", 25525)', setup='import struct', number=3000000)
print('case 1', result)
result = timeit.timeit('(25525).to_bytes(2, byteorder="little")', number=3000000)
print('case 2', result)
result = timeit.timeit('struct.pack("<I", 25525)', setup='import struct', number=3000000)
print('case 3', result)
result = timeit.timeit('(25525).to_bytes(4, byteorder="little")', number=3000000)
print('case 4', result)
result = timeit.timeit('struct.pack("<Q", 255252552525525)', setup='import struct', number=3000000)
print('case 5', result)
result = timeit.timeit('(255252552525525).to_bytes(8, byteorder="little")', number=3000000)
print('case 6', result)

실행 결과는 다음과 같았습니다.


case 1 0.24562080000000003
case 2 0.29117760000000004
case 3 0.2068852
case 4 0.33815569999999995
case 5 0.29757940000000005
case 6 0.34646350000000004

미미하긴 하지만, to.bytes() 함수보다는 struct.pack() 함수를 이용하는 것이 더 성능이 좋았습니다. 그리고 추가적으로 struct.pack() 함수를 이용하면, 통신 프로그램을 작성할 때, 필요한 구조체 형식의 데이터를 다루는데 아주 적합합니다. 이 부분에 대해서는 다음에 기회가 되면 다시 정리하여 올리도록 하겠습니다.

참고

https://www.delftstack.com/ko/howto/python/how-to-convert-int-to-bytes-in-python-2-and-python-3/

 

Python 2 및 Python 3에서 Int 를 바이트로 변환하는 방법

Python struct 모듈의 pack 함수는 Python 2.7 및 Python 3에서 int 를 바이트로 변환 할 수 있으며 Python 3.1의 int_to_bytes()는 지정된 바이트 순서로 int 를 바이트로 변환 할 수 있습니다.

www.delftstack.com

 

https://docs.python.org/ko/3/library/stdtypes.html 

 

내장형 — Python 3.9.5 문서

다음 섹션에서는 인터프리터에 내장된 표준형에 관해 설명합니다. 기본 내장 유형은 숫자, 시퀀스, 매핑, 클래스, 인스턴스 및 예외입니다. 일부 컬렉션 클래스는 가변입니다. 제자리에서 멤버

docs.python.org