Eu tenho uma longa seqüência de caracteres hexadecimal que representa uma série de valores de diferentes tipos. Desejo converter esse Hex String em uma matriz de bytes, para que eu possa mudar cada valor e convertê-lo em seu tipo de dados apropriado.
150
Respostas:
Suponha que sua string hexadecimal seja algo como
Converta-o em uma string (Python ≤ 2.7):
ou desde Python 2.7 e Python 3.0:
Observe que
bytes
é uma versão imutável dobytearray
.fonte
string
->bytes
objeto, é `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` que gerab'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Não postando como resposta, já que a pergunta pede matriz de bytes, mas postando aqui, pois é o primeiro hit que recebi ao pesquisar por hext para bytes.hex_string.decode("hex")
está trabalhando no Python 2.7. Acabei de testar no meuPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
gera um erro quando a sequência de entrada possui um número ímpar de caracteres:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.Há uma função interna no bytearray que faz o que você pretende.
Retorna um bytearray e lê seqüências hexadecimais com ou sem separador de espaço.
fonte
hex_string.decode("hex")
que não.desde que eu entendi corretamente, você deve procurar binascii.unhexlify
fonte
unhexlify
é a maneira mais eficiente de ir aqui, mas sugeriria queb = bytearray(s)
seria melhor do que usarord
. Como Python tem um built-in tipo apenas para matrizes de bytes Estou surpreso que ninguém o está usandoSupondo que você tenha uma sequência de bytes assim
"\ x12 \ x45 \ x00 \ xAB"
e você sabe a quantidade de bytes e seu tipo, você também pode usar essa abordagem
Como especifiquei little endian (usando o caractere '<') no início da string de formato, a função retornou o equivalente decimal.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B é igual a um byte (8 bits) não assinado
H é igual a dois bytes (16 bits) não assinado
Mais caracteres disponíveis e tamanhos de bytes podem ser encontrados aqui
As vantagens são ..
Você pode especificar mais de um byte e o endian dos valores
Desvantagens ..
Você realmente precisa saber o tipo e o comprimento dos dados com os quais está lidando
fonte
Você deve conseguir construir uma string contendo os dados binários usando algo como:
Provavelmente, essa não é a maneira mais rápida (muitas sequências de caracteres acrescentadas), mas é bastante simples usando apenas o Python principal.
fonte
Você pode usar o módulo Codecs na biblioteca padrão do Python, ou seja,
fonte
fonte
Um bom liner é:
Isso irá percorrer cada caractere na string e executá-lo através da função ord (). Testado apenas no python 2.6, não tenho muita certeza sobre o 3.0+.
-Josh
fonte
byte_list = bytearray(hex_string)