복붙노트

[PYTHON] 파이썬 int를 빅 엔디안 바이트 문자열로 변환하십시오.

PYTHON

파이썬 int를 빅 엔디안 바이트 문자열로 변환하십시오.

나는 음수가 아닌 int가 있고 그것을 동일한 데이터를 포함하는 big-endian 문자열로 효율적으로 변환하려고합니다. 예를 들어, int 1245427 (0x1300F3)은 바이트 값이 0x13, 0x00 및 0xf3 인 세 문자를 포함하는 길이가 3 인 문자열이됩니다.

내 int는 35 (10 진수) 자릿수입니다.

어떻게해야합니까?

해결법

  1. ==============================

    1.struct 모듈을 사용할 수 있습니다 :

    struct 모듈을 사용할 수 있습니다 :

    import struct
    print struct.pack('>I', your_int)
    

    '> 나는 형식 문자열입니다. >는 빅 엔디안을 의미하며 unsigned int를 의미합니다. 다른 형식의 문자에 대해서는 설명서를 확인하십시오.

  2. ==============================

    2.Python 3.2 이상에서는 int.to_bytes를 사용할 수 있습니다.

    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'
    
  3. ==============================

    3.이것은 빠르고 작고 (임의의) 큰 int에 대해 작동합니다.

    이것은 빠르고 작고 (임의의) 큰 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'
    
  4. ==============================

    4.아마도 가장 좋은 방법은 내장 된 struct 모듈을 사용하는 것입니다.

    아마도 가장 좋은 방법은 내장 된 struct 모듈을 사용하는 것입니다.

    >>> 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 비트 (부호없는 long long)로 압축하고 struct.pack ( '> L', 1245427)을 사용하지만 [1 :] 단계는 건너 뜁니 까?

  5. ==============================

    5.

    def tost(i):
      result = []
      while i:
        result.append(chr(i&0xFF))
        i >>= 8
      result.reverse()
      return ''.join(result)
    
  6. ==============================

    6.@pts의 대답에 기반한 단일 소스 Python 2/3 호환 버전 :

    @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'
    
  7. ==============================

    7.bitstring 모듈 사용 :

    bitstring 모듈 사용 :

    >>> bitstring.BitArray(uint=1245427, length=24).bytes
    '\x13\x00\xf3'
    

    이 메소드의 경우, 작성중인 비트 스트링의 길이 (비트)를 지정해야합니다.

    내부적으로 이것은 Alex의 대답과 거의 같지만 데이터로 더 많은 일을하려면 모듈에 많은 추가 기능이 있습니다.

  8. ==============================

    8.가장 짧은 방법은 다음과 같습니다.

    가장 짧은 방법은 다음과 같습니다.

    import struct
    val = 0x11223344
    val = struct.unpack("<I", struct.pack(">I", val))[0]
    print "%08x" % val
    

    이것은 정수를 바이트 스왑 된 정수로 변환합니다.

  9. from https://stackoverflow.com/questions/846038/convert-a-python-int-into-a-big-endian-string-of-bytes by cc-by-sa and MIT license