Programing

Python int를 빅 엔디안 바이트 문자열로 변환

crosscheck 2020. 12. 29. 07:39
반응형

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

반응형