Pergunta

Estou abrindo um arquivo binário como assim:

file = open("test/test.x", 'rb')

e lendo em filas para uma lista. Cada linha se parece um pouco com:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'

Estou tendo dificuldade em manipular esses dados. Se eu tentar imprimir cada linha, o python congela e emite ruídos de bipe (acho que há um código binário binário em algum lugar). Como faço para usar esses dados com segurança? Como posso converter cada número hexadecimal em decimal?

Foi útil?

Solução

Para imprimi -lo, você pode fazer algo assim:

print repr(data)

Para a coisa toda como hexadecimal:

print data.encode('hex')

Para o valor decimal de cada byte:

print ' '.join([str(ord(a)) for a in data])

Para descompactar números inteiros binários, etc. dos dados como se eles originalmente viessem de uma estrutura de estilo C, olhe para o estrutura módulo.

Outras dicas

\xhh é o personagem com valor hexadecimal hh. Outros personagens como . e `~ 'são caracteres normais.

A iteração de uma string fornece os personagens nela, um de cada vez.

ord(c) retornará um número inteiro representando o personagem. Por exemplo, ord('A') == 65.

Isso imprimirá os números decimais para cada caractere:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)

Como o teatro mencionado, Ord e Hex podem ajudá -lo. Se você quiser tentar interpretar algum tipo de dados binários estruturados no arquivo, o estrutura O módulo pode ser útil.

Os dados binários raramente são divididos em "linhas" separadas por ' n'. Se for, terá um mecanismo de escape implícito ou explícito para distinguir entre ' n' como um terminador de linha e ' n' como parte dos dados. Ler esse arquivo como linhas cegamente, sem o conhecimento do mecanismo de fuga, é inútil.

Para responder às suas preocupações específicas:

' x07' é o personagem ASCII BEL, que originalmente era para tocar a campainha em uma máquina de teletipo.

Você pode obter o valor inteiro de um byte 'B' fazendo ord(b).

No entanto, para processar dados binários corretamente, você precisa saber qual é o layout. Você pode ter inteiros assinado e não assinado (dos tamanhos 1, 2, 4, 8 bytes), números de ponto flutuante, números decimais de comprimentos variados, cordas de comprimento fixo, cordas de comprimento variável, etc. Complicação adicionada vem se os dados são registrados na moda Bigendiana ou na moda Littlendian. Depois de conhecer todos os itens acima (ou ter muito bons palpites informados), o Módulo Struct Python deve ser capaz de ser usado para todos ou a maior parte do seu processamento; a módulo ctypes também pode ser útil.

O formato de dados tem um nome? Nesse caso, diga -nos; Podemos apontar você para codificar ou documentos.

Você pergunta "Como faço para usar esses dados com segurança?" O que levanta a pergunta: para que você deseja usá -lo? Que manipulações você quer fazer?

Você está tentando imprimir os dados convertidos em caracteres ASCII, que não funcionarão.

Você pode usar com segurança qualquer byte dos dados. Se você quiser imprimi -lo como hexadecimal, olhe para as funções ord e hex/

Você está usando read() ou readline()? Você deveria estar usando read(n) ler n bytes; readline() lerá até que ele atinja uma nova linha, que o arquivo binário pode não ter.

Em ambos os casos, porém, você retornou uma série de bytes, que pode ser caracteres imprimíveis ou não impressos, e provavelmente não é muito útil.

O que você quer é ord(), que converte uma sequência de um byte no valor inteiro correspondente. read() do arquivo um byte de cada vez e ligue ord() no resultado, ou itera através de toda a string.

Se você está disposto a usar Numpy e BitStream, você pode fazer

>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
         7, 190,   3, 222,   7, 254,  10], dtype=uint8)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top