파이썬에서 16 진수 문자열을 바이트 배열로


150

다른 유형의 일련의 값을 나타내는 긴 16 진수 문자열이 있습니다. 이 16 진수 문자열을 바이트 배열로 변환하여 각 값을 이동시키고 적절한 데이터 유형으로 변환 할 수 있습니다.


16 진수 문자열은 어떻게 생겼습니까?
khachik

답변:


239

16 진 문자열이 다음과 같다고 가정하십시오.

>>> hex_string = "deadbeef"

문자열로 변환하십시오 (Python ≤ 2.7).

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

또는 Python 2.7 및 Python 3.0 이후 :

>>> bytes.fromhex(hex_string)  # Python ≥ 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

bytes의 불변의 버전입니다 bytearray.


27
누군가 16 진수 string-> bytes객체를 찾고 있다면 `bytes.fromhex ( "000102030405060708090A0B0C0D0E0F")`입니다 b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'. 질문에 바이트 배열을 요구하기 때문에 답변으로 게시하지 않지만 바이트 옆을 검색 할 때 얻은 첫 번째 히트이므로 여기에 게시하십시오.
matrixanomaly

@Hubro 실제로 hex_string.decode("hex")는 Python 2.7에서 작업하고 있습니다. 방금 테스트했습니다 Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32.
MewX

@MewX 나는 파이썬 2.7이 아닌 파이썬 3을 말했다
Hubro

3
참고bytes.fromhex 입력 문자열은 문자의 홀수가있는 경우 오류가 발생합니다 : bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3.
Константин Ван

143

bytearray에는 의도 한 기능을 수행하는 내장 함수가 있습니다.

bytearray.fromhex("de ad be ef 00")

바이트 배열을 반환하고 공백 구분 기호가 있거나없는 16 진 문자열을 읽습니다.


4
확실한 최고의 답변!
Maiku Mori

5
이것은 Python 3에서 작동하지만 hex_string.decode("hex")그렇지 않습니다.
Eric O Lebigot

15

내가 올바르게 이해했다면 binascii를 찾아야합니다.

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]

4
이것이 unhexlify가장 효율적인 방법 이라는 데 동의 하지만을 사용하는 b = bytearray(s)것보다 낫습니다 ord. 파이썬은 바이트 배열만을위한 내장 타입을 가지고 있기 때문에 아무도 그것을 사용하지 않는 것에 놀랐습니다
Scott Griffiths

8

바이트 문자열이 있다고 가정하면

"\ x12 \ x45 \ x00 \ xAB"

그리고 당신은 바이트의 양과 그 유형을 알고 있습니다.

import struct

bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

형식 문자열의 시작 부분에 리틀 엔디안 ( '<'char 사용)을 지정함에 따라 함수는 10 진수를 반환했습니다.

0x12 = 18

0x45 = 69

0xAB00 = 43776

B는 부호없는 1 바이트 (8 비트)와 같습니다.

H는 부호없는 2 바이트 (16 비트)와 같습니다.

더 많은 문자 및 바이트 크기는 여기에서 찾을 수 있습니다

장점은 ..

하나 이상의 바이트와 값의 엔디안을 지정할 수 있습니다

단점

처리하는 데이터의 유형과 길이를 알아야합니다.


2
단점 : 16 진수 문자열이 아닌 바이트 문자열이므로 질문에 대한 답변이 아닙니다.
qris

그것은 질문의 두 번째 부분에 대한 대답입니다. "... 각각의 값을 옮기고 올바른 데이터 유형으로 변환 할 수 있습니다".
Rainald62

2

다음과 같은 방법으로 이진 데이터를 보유하는 문자열을 작성할 수 있어야합니다.

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

이것은 아마도 가장 빠른 방법은 아니지만 (많은 문자열 추가) 핵심 Python 만 사용하면 매우 간단합니다.


2

파이썬 표준 라이브러리에서 코덱 모듈 을 사용할 수 있습니다.

import codecs

codecs.decode(hexstring, 'hex_codec')

-3
def hex2bin(s):
    hex_table = ['0000', '0001', '0010', '0011',
                 '0100', '0101', '0110', '0111',
                 '1000', '1001', '1010', '1011',
                 '1100', '1101', '1110', '1111']
    bits = ''
    for i in range(len(s)):
        bits += hex_table[int(s[i], base=16)]
    return bits

-4

좋은 라이너는 :

byte_list = map(ord, hex_string)

문자열의 각 문자를 반복하고 ord () 함수를 통해 실행합니다. 파이썬 2.6에서만 테스트되었으며 3.0 이상은 확실하지 않습니다.

-조롱


완전한. python 2.7 작업
Richard

이 답변 옆의 확인 표시 개요를 클릭하십시오. :)
jathanism

1
이것은 16 진수를 변환하지 않습니다-문자열의 각 문자를 정수로 변환합니다. 16 진수의 경우 각 문자 쌍은 바이트를 나타냅니다. 당신은뿐만 아니라 단지 말할 수있다byte_list = bytearray(hex_string)
스콧 그리피스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.