긴 16 진수 문자열에서 파이썬 바이트 객체를 만드는 방법은 무엇입니까?


89

문자열에 긴 16 진수 숫자가 있습니다.

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

훨씬 더 길고 몇 킬로바이트입니다. 파이썬 2.6 / 3에서 이것을 바이트 객체로 변환하는 내장 방법이 있습니까?


4
아래 답변은 비슷해 보일 수 있지만 다른 유형의 값을 반환합니다. s.decode ( 'hex')는 unhexlify (s)와 마찬가지로 str을 반환합니다. bytearray.fromhex (s)는 바이트 배열을 반환합니다. 이 질문의 문구를 감안할 때 큰 녹색 확인 표시는 s.decode ( 'hex')가 아니라 bytearray.fromhex (s)에 있어야한다고 생각합니다.
Paul Hoffman


2
2 년 후 생성 된 질문의 중복이 될 수있는 방법은 무엇입니까?
재귀 적

1
@CiroSantilli 郝海东 冠状 病 六四 事件 法轮功 바이트 문자열은 바이트 배열이 아닙니다. stackoverflow.com/questions/1740696/…
LarsH

@LarsH 충분히 공정합니다. @ 재귀 : 날짜가 주요 요인이되지 않습니다 : meta.stackexchange.com/questions/147643/...
치로 틸리郝海东冠状病六四事件法轮功

답변:


95

python3을 포함하여 Python 2.7 이상에서 작동합니다.

result = bytearray.fromhex('deadbeef')

참고 :bytearray.fromhex() Python 2.6 의 함수에 버그가있는 것 같습니다 . python.org 문서에는 함수가 문자열을 인수로 받아들이지 만 적용되면 다음 오류가 발생한다고 명시되어 있습니다.

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str`

9
그리고 한 가지 추가 단계로, 바이트 문자열 (예 : Python 3의 b '\ x04 \ xea [...]')을 원했습니다.이 문자열은 다음으로 바이트 배열에서 얻을 수 있습니다.bytes(bytearray.fromhex('deadbeef'))
berto

5
@berto :이 경우 더 직접적인 경로가 binascii.unhexlify().
Martijn Pieters

1
감사합니다, @MartijnPieters, 제가 한 번해볼 게요
berto

1
이 답변은 질문이 요청한 내용을 수행하지 않습니다. 파이썬 바이트 문자열이 아닌 가변 바이트 배열을 반환합니다. 이는 문자열이 아닌 문자열 배열을 반환하는 것과 같습니다.
Mike Martin

1
@LarsH : 이전 Python 2 릴리스에서는 해당 메서드를 사용할 수 없습니다. 오늘은 더 이상 중요하지 않지만 2016 년에 문제가되었습니다.
Martijn Pieters

73
result = bytes.fromhex(some_hex_string)

2
이것은 원래 게시물이 요구하는 것을 수행하는 가장 직접적인 방법 인 것 같습니다. 이것이 허용되지 않는 이유가 있습니까?
Sebastian Gaweda

fromhex () 메서드 (바이트 및 bytearray 모두)는 16 진수 숫자가 공백으로 구분 될 때도 작동합니다. 매우 편리합니다!
Klaws

1
이것은 정말로 받아 들여지는 대답이어야합니다. 현재 허용 된 답변은 질문 한 내용을 수행하지 않습니다. 바이트 문자열이 아닌 가변 바이트 배열을 반환합니다.
Mike Martin

40

16 진 코덱으로이 작업을 수행 할 수 있습니다. 즉 :

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'

16
codecs.decode('0a0a0a', 'hex_codec')2.x 및 3.x에서 작동해야합니다. :-)
Abbafei 2014 년

37

binascii 모듈 사용해보기

from binascii import unhexlify
b = unhexlify(myhexstr)

9
2.x에서 두 가지 방법, 3.x에서 세 가지 방법. 그래서 많은 ... "그것을 할 수있는 단 하나의 방법이"에 대한
technomalogical

다른 두 가지 방법은 더 '내장'되어 있으므로 실제로 그중 하나를 사용합니다.
Crescent Fresh

@technomalogical : 귀하의 의견은 답변과 관련이 없습니다. 아마도 그것을 삭제하고 comp.lang.python에 대한 게시물로 변경해야합니다.
tzot

1
@technomalogical : ΤΖΩΤΖΙΟΥ에 동의합니다. 또한, 틀 렸습니다. 올바른 문구는 다음과 같습니다. 한 가지, 바람직하게는 한 가지 확실한 방법이 있어야합니다.
nosklo

2
Python 3.2 (설계 상 또는 버그인지 확실하지 않음)에서는 unhexlify이제 문자열을 허용하지 않고 바이트 만 허용합니다. 정말 어리석은 일이지만 사용해야한다는 뜻입니다b = unhexlify(bytes(myhexstr, 'utf-8'))
Scott Griffiths

2
import binascii

binascii.a2b_hex(hex_string)

그게 내가 한 방식입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.