파이썬에서 바이너리 육각형 데이터를 포장 할 수있는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/200738

  •  03-07-2019
  •  | 
  •  

문제

PHP 사용 팩() 함수, 나는 문자열을 이진 육각 표현으로 변환했다.

$string = md5(time); // 32 character length
$packed = pack('H*', $string);

H* 서식은 "16 진수, 높은 니블 먼저"를 의미합니다.

PHP에서 이것을 풀려면 단순히 풀다() h* 형식 플래그와 기능합니다.

이 데이터를 Python에서 어떻게 풀겠습니까?

도움이 되었습니까?

해결책

이 작업을 수행하는 쉬운 방법이 있습니다. binascii 기준 치수:

>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'

니블 주문에 대해 오해를하지 않는 한 (첫 번째는 기본값입니다), 그것은 완벽하게 충분해야합니다!

또한, 파이썬은 hashlib.md5 물체에는 a hexdigest() 메소드 MD5 다이제스트를 ASCII 육각 문자열로 자동 변환하여 MD5 다이제스트에는이 방법이 필요하지 않도록합니다. 도움이되기를 바랍니다.

다른 팁

struct.pack에 해당하는 "Hex Nibble"코드가 없으므로 다음과 같이 먼저 바이트로 수동으로 포장해야합니다.

hex_string = 'abcdef12'

hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low) 
               for high, low in zip(hexdigits[::2], hexdigits[1::2]))

또는 더 나은 것은 Hex Codec을 사용할 수 있습니다. 즉.

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

포장을 풀려면 결과를 유사하게 16 진로 다시 인코딩 할 수 있습니다.

>>> data.encode('hex')
'abcdef12'

그러나 예를 들어, 인코딩 할 때 육각 표현을 통해 왕복을 할 필요가 없을 것입니다. MD5 이진 다이제스트를 직접 사용하십시오. 즉.

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

이것은 팩 () ED 표현과 동일합니다. HEX 표현을 얻으려면 위의 동일한 포장되지 않은 방법을 사용하십시오.

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

편집] : 더 나은 방법을 사용하도록 업데이트되었습니다 (Hex Codec)

파이썬에서 당신은 그것을 사용합니다 구조 이것을위한 모듈.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

HTH

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top