Pergunta

Eu estou procurando um script (ou superior nível programação) língua (ou por exemplo, módulos para Python ou línguas semelhantes) para facilmente analisar e manipular dados binários em arquivos (por exemplo core dumps), bem como Perl permite manipular arquivos de texto muito bem .

As coisas que eu quero fazer incluem apresentando pedaços arbitrários dos dados em várias formas (binário, decimal, hexadecimal), dados converter de um endianess para outro, etc. Ou seja, as coisas que você normalmente usaria C ou montagem para, mas Eu estou procurando uma linguagem que permite escrever pequenos pedaços de código para fins muito específicos, de uma só vez muito rapidamente.

Todas as sugestões?

Foi útil?

Solução

As coisas que eu quero fazer incluem apresentando pedaços arbitrários dos dados em várias formas (binário, decimal, hexadecimal), dados converter de um endianess para outro, etc. Ou seja, as coisas que você normalmente usaria C ou montagem para, mas Eu estou procurando uma linguagem que permite escrever pequenos pedaços de código para fins muito específicos, de uma só vez muito rapidamente.

Bem, embora possa parecer contra-intuitivo, achei erlang extremamente bem adequado para isso, nomeadamente devido ao seu poderoso suporte para padrão de correspondência , mesmo para bytes e bits (chamados " Erlang Bit Sintaxe "). O que torna muito fácil criar programas ainda muito avançados que lidam com inspeção e manipulação de dados em um byte e até mesmo em um nível pouco:

Desde 2001, o funcional linguagem Erlang vem com um tipo de dados orientado a byte (chamado binário) e com construções para fazer correspondência de padrões em um binário.

E para citar informIT.com :

(Erlang) Correspondência de padrões realmente começa a ficar divertido quando combinado com o binário tipo. Considere um aplicativo que recebe pacotes a partir de uma rede e em seguida, processa-los. Os quatro bytes de um pacote pode ser um byte-order rede do tipo de identificador de pacotes. Em Erlang, você só precisa de um único processPacket função que poderia converter isso em uma estrutura de dados para interno em processamento. Seria algo assim:

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

Assim, erlang com o seu suporte incorporado para correspondência de padrão e de ser uma linguagem funcional é expressivo bonita, ver, por exemplo a implementação de ueencode em erlang:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

Para uma introdução, consulte Bitlevel binários e generalizadas Comprehensions em Erlang . você também pode querer verificar para fora algumas das seguintes indicações:

Outras dicas

O Python bitstring módulo foi escrito para este fim. Ele permite que você tomar fatias arbitrários de dados e ofertas binários um número de diferentes interpretações por meio de propriedades Python. Ele também dá uma abundância de ferramentas para a construção e modificação de dados binário.

Por exemplo:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

Há também funções para leitura bit-wise e navegação na bitstring, bem como em arquivos; na verdade, isso pode ser feito diretamente de um arquivo sem lê-lo na memória:

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

Existem também pontos de vista com diferentes endiannesses, bem como a capacidade de endianness swap e muito mais - dê uma olhada no manual do .

Dê uma olhada python bitstring , parece como exatamente o que você quer:)

Eu estou usando 010 Editor para visualizar arquivos binários o tempo todo para ver arquivos binários. É especialmente voltado ao trabalho com arquivos binários.

Tem um fácil de usar c-como linguagem de script para analisar arquivos binários e apresentá-los de uma forma muito legível (como uma árvore, campos codificados por cores, coisas assim) .. Existem alguns exemplos de scripts para analisar zipfiles e bmpfiles.

Sempre que eu criar um formato de arquivo binário, eu sempre fazer um pequeno script para 010 editor para visualizar os arquivos. Se você tem alguns arquivos de cabeçalho com algumas estruturas, fazendo um leitor para arquivos binários é uma questão de minutos.

Qualquer linguagem de programação de alto nível com funções de carga / descompactar vai fazer. Todos os 3 Perl, Python e Ruby pode fazê-lo. É questão de preferência pessoal. Eu escrevi um pouco de análise binária em cada um deles e senti que Ruby era mais fácil / mais elegante para esta tarefa.

Por que não usar um interpretador de C? Eu sempre usou para experimentar com trechos, mas você poderia usar um script algo como você descreve, sem muita dificuldade.

Eu sempre gostei EiC . Ele estava morto, mas o projeto foi ressuscitada recentemente. EIC é surpreendentemente capaz e razoavelmente rápido. Há também CINT é. Ambos podem ser compilado para diferentes plataformas, embora eu acho que CINT precisa Cygwin no windows.

biblioteca padrão do Python tem algumas das que você precisa - o módulo matriz na especial permite que você leia facilmente partes de arquivos binários, endianness swap, etc; o struct módulo permite a interpretação de grão mais fino de cadeias binárias. No entanto, nem é tão rico como você exige: por exemplo, para apresentar os mesmos dados como bytes ou meias palavras, você precisa copiá-lo entre duas matrizes (o numpy de terceiros add-on é muito mais poderoso para interpretar a mesma área de memória de várias maneiras diferentes), e, por exemplo, para exibir alguns bytes em hex não há nada muito " empacotado" para além de um loop simples ou compreensão da lista, como [hex(b) for b in thebytes[start:stop]]. Eu suspeito que há reutilizáveis ??módulos de terceiros para facilitar essas tarefas ainda mais, mas eu não posso apontar-lhe uma ...

Forth também pode ser muito bom nisso, mas é um pouco misterioso.

Bem, se a velocidade não é uma consideração, e você quer perl, então traduzir cada linha de binário em uma linha de caracteres - 0 e 1 do. Sim, eu sei que não há linefeeds em binário :) mas provavelmente você tem algum tamanho fixo - por exemplo, por byte ou alguma outra unidade, com o qual você pode dividir o blob binário.

Em seguida, basta usar o processamento de strings perl em que os dados:)

Se você está fazendo o processamento nível binário, é muito baixo nível e necessidades susceptíveis de ser muito eficiente e ter dependências mínimas / requisitos de instalação.

Assim, gostaria de ir com C - alças bytes bem -. E provavelmente você pode google para alguns pacotes de bibliotecas que pega bytes

Indo com algo como Erlang introduz ineficiências, dependências, e outra bagagem que você provavelmente não quer com uma biblioteca de baixo nível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top