Python int를 빅 엔디안 바이트 문자열로 변환
음수가 아닌 int가 있고 동일한 데이터를 포함하는 빅 엔디안 문자열로 효율적으로 변환하고 싶습니다. 예를 들어 int 1245427 (0x1300F3)은 바이트 값이 0x13, 0x00 및 0xf3 인 3 개의 문자를 포함하는 길이 3의 문자열을 생성해야합니다.
내 정수는 35 자리 (밑수 10)입니다.
어떻게해야합니까?
struct 모듈을 사용할 수 있습니다 .
import struct
print struct.pack('>I', your_int)
'>I'
형식 문자열입니다. >
빅 엔디안을 I
의미하고 부호없는 정수를 의미합니다. 더 많은 형식 문자에 대한 문서를 확인하십시오.
Python 3.2 이상에서는 int.to_bytes 사용할 수 있습니다 .
크기를 지정하지 않으려면
>>> n = 1245427
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big') or b'\0'
b'\x13\x00\xf3'
크기를 지정해도 괜찮다면
>>> (1245427).to_bytes(3, byteorder='big')
b'\x13\x00\xf3'
이것은 빠르고 작고 (임의의) 큰 int에서 작동합니다.
def Dump(n):
s = '%x' % n
if len(s) & 1:
s = '0' + s
return s.decode('hex')
print repr(Dump(1245427)) #: '\x13\x00\xf3'
아마도 가장 좋은 방법은 내장 구조체 모듈을 사용하는 것입니다 .
>>> import struct
>>> x = 1245427
>>> struct.pack('>BH', x >> 16, x & 0xFFFF)
'\x13\x00\xf3'
>>> struct.pack('>L', x)[1:] # could do it this way too
'\x13\x00\xf3'
또는 실수하기 쉽기 때문에 일반적으로 권장하지 않습니다. 시프트 및 chr()
기능을 통해 "수동"으로 수행 할 수 있습니다 .
>>> x = 1245427
>>> chr((x >> 16) & 0xFF) + chr((x >> 8) & 0xFF) + chr(x & 0xFF)
'\x13\x00\xf3'
호기심 때문에 왜 3 바이트 만 필요합니까? 일반적으로 이러한 정수를 전체 32 비트 (a C unsigned long
)로 struct.pack('>L', 1245427)
압축 하고 사용 하지만 [1:]
단계를 건너 뜁니다 .
@pts의 답변을 기반으로 한 단일 소스 Python 2/3 호환 버전 :
#!/usr/bin/env python
import binascii
def int2bytes(i):
hex_string = '%x' % i
n = len(hex_string)
return binascii.unhexlify(hex_string.zfill(n + (n & 1)))
print(int2bytes(1245427))
# -> b'\x13\x00\xf3'
def tost(i):
result = []
while i:
result.append(chr(i&0xFF))
i >>= 8
result.reverse()
return ''.join(result)
은 Using 비트 스트링 모듈 :
>>> bitstring.BitArray(uint=1245427, length=24).bytes
'\x13\x00\xf3'
이 방법의 경우 생성중인 비트 문자열의 길이를 비트 단위로 지정해야합니다.
Internally this is pretty much the same as Alex's answer, but the module has a lot of extra functionality available if you want to do more with your data.
The shortest way, I think, is the following:
import struct
val = 0x11223344
val = struct.unpack("<I", struct.pack(">I", val))[0]
print "%08x" % val
This converts an integer to a byte-swapped integer.
ReferenceURL : https://stackoverflow.com/questions/846038/convert-a-python-int-into-a-big-endian-string-of-bytes
'Programing' 카테고리의 다른 글
JUnit5에서 Mockito를 사용하는 방법 (0) | 2020.12.29 |
---|---|
실수로 체크인 취소 (0) | 2020.12.29 |
SOA (서비스 지향 아키텍처) 란 무엇입니까? (0) | 2020.12.29 |
Control.BeginInvoke에 대한 MethodInvoker 대 작업 (0) | 2020.12.29 |
ListView 항목이 콘텐츠를 래핑하기 위해 커지지 않는 이유는 무엇입니까? (0) | 2020.12.29 |