Um ambiente semelhante a shell para processamento binário

15

Essa pergunta me ocorreu algumas vezes antes, agora em resposta à pergunta Faz o loop através de blocos de dados binários do stdin no Bash As respostas dadas no link também não foram satisfatórias .

Estou procurando um ambiente de script adequado especificamente para lidar com E / S com arquivos binários. Eu sei que posso usar uma das linguagens de programação totalmente desenvolvidas (c / Python / ...), mas elas têm uma enorme sobrecarga de inicialização e codificação (alocação e fread / fwrite em c, bitstrings em Python ...) sem mencionar eles são menos adequados para scripts (chamando outros aplicativos dele). O Perl não é melhor com suas funções unpack , operação orientada por string e sintaxe pateta.

Algo como od , mas como idioma.

O que eu espero:

  1. define ou altera o endianness com um único switch / comando.
  2. especificação simples do tipo solicitado (algo como estender bash read var com int32 var , float var etc.).
  3. manipulação de canais binários, ignorando o número especificado de bytes.
  4. controle de fluxo de script padrão (para / if / ...) ao qual estamos acostumados.

Gostaria de processar dados brutos (fotografia, dados científicos, formatos desconhecidos e mal documentados) com a mesma facilidade e discernimento que você obtém ao inspecionar arquivos ASCII. Estou usando c agora, mas não é ideal para scripts ad-hoc e não pode ser interativo.

Alguém conhece uma ferramenta como essa? Nenhum software GUI clicky, por favor, ele precisa trabalhar sobre o ssh, de outros scripts e assim por diante. "Não existe" é uma resposta aceitável, mas deprimente.

    
por orion 10.03.2014 / 12:52

4 respostas

2

Você não precisa necessariamente "fazer as pazes" com o empacotamento do Perl ... uma das melhores coisas sobre o perl é como você pode abusar do analisador e da tabela de símbolos para criar seu próprio idioma, em um pacote personalizado.

É basicamente isso que você está procurando?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

O exercício, então, é aprender o suficiente perl para escrever o pacote MyBinLib. Pergunte em um fórum Perl e as pessoas provavelmente ficariam felizes em ajudar.

    
por 29.10.2014 / 06:48
1

Você se deparou com beav tem macros, mas não consegui encontrar scripts,

apt-cache show beav extract:

With beav, you can edit a file in HEX, ASCII, EBCDIC, OCTAL, DECIMAL, and BINARY. You can display but not edit data in FLOAT mode. You can search or search and replace in any of these modes. Data can be displayed in BYTE, WORD, or DOUBLE WORD formats. While displaying WORDS or DOUBLE WORDS the data can be displayed in INTEL's or MOTOROLA's byte ordering. Data of any length can be inserted at any point in the file. The source of this data can be the keyboard, another buffer, or a file. Any data that is being displayed can be sent to a printer in the displayed format. Files that are bigger than memory can be handled.

Depois, há xxd que converte para / do modo de exibição binário / ascii e pode ser combinado com sed ou vi , mas não possui o recurso de troca de bytes.

    
por 10.03.2014 / 14:50
1

Eu tenho exatamente o mesmo problema que você por anos também.

Para usos não-interativos simples, eu gosto de usar o editor de bloco binário BBE . O BBE é para o binário como o SED é para o texto, incluindo sua sintaxe arcaica e simplicidade, no entanto, ele tem muitos recursos ausentes do que eu frequentemente preciso, então eu tenho que combiná-lo com outras ferramentas. Então, o BBE é apenas uma solução parcial. Observe também que o BBE não tem atualizações ou melhorias há anos.

É claro que é possível usar xxd before e xxd -r após editar os dados com ferramentas baseadas em texto, mas isso não funcionará quando os dados em questão forem grandes e for necessário acesso aleatório, por exemplo, ao processar o bloco dispositivos.

(Nota: Para Windows, existe pelo menos a linguagem de script WinHex cara e proprietária, mas isso não nos levará a lugar algum.)

Para uma edição binária mais complicada, geralmente também recorro ao Python, mesmo que às vezes seja muito lento para arquivos grandes, o que é a principal desvantagem. Espero que o Pyston (Python que emprega o LLVM para compilar para código de máquina otimizado) algum dia amadureça o suficiente para ser utilizável, ou melhor ainda, alguém irá projetar e implementar uma linguagem de script de processamento binário compacta, rápida e versátil, que ainda não existe para sistemas semelhantes ao U * IX.

UPDATE

Eu também uso o homebrew, o assembler de código aberto Intel x86 flat assembler , ou fasm para curtos, que evoluiu para muito mais do que apenas um montador.

Ele possui um poderoso pré-processador de macro baseado em textblock (ele próprio uma linguagem completa) com uma sintaxe na tradição da linguagem macro turbo assembler da borland, mas muito mais avançada.

Além disso, ele possui uma linguagem de manipulação de dados, que permite incluir arquivos arbitrários binários, fazer todos os tipos de manipulação binária e aritmética (somente inteiro) em "tempo de compilação" e gravar o resultado em um arquivo de saída. Esta linguagem de manipulação de dados tem estruturas de controle e também está completa.

É muito mais fácil de usar do que escrever um programa que faça alguma manipulação binária em C e provavelmente até mesmo em python. Além disso, ele carrega rapidamente, já que é um executável de pequeno porte com quase nenhuma dependência externa (Existem 2 versões: ou requer apenas libc ou pode ser executado como um executável estático diretamente na ABI do kernel Linux).

Ele tem algumas bordas de ruff, como

  1. não suporta simultaneidade

  2. sendo escrito em um assembly x86 de 32 bits (no x86_64, no entanto), você provavelmente precisará do qemu ou de um emulador similar se quiser executá-lo em algo diferente de x86 ou x86_64

  3. é poderosa a linguagem de pré-processamento de macros concluída, isso significa que é melhor ter alguma experiência com linguagens como Lisp, Haskell, XSLT ou, provavelmente, M4 seria a melhor escolha.

  4. todos os dados a serem gravados no arquivo de saída são executados em um buffer "simples" na memória, e esse buffer pode crescer, mas não diminuir até que o arquivo de saída tenha sido gravado e terminado em fasm. Isso significa que só é possível gerar arquivos tão grandes quanto a memória principal deixada em uma única execução de fasm.

  5. os dados só podem ser gravados em um único arquivo de saída para cada execução de fasm

  6. sim, é homebrew, realmente interessante e inteligente

por 18.09.2014 / 21:56
0

Você sempre pode ir para o ouro e cair em C ou ASM. Se você estiver trabalhando com um binário bruto, basta devolvê-lo diretamente do registrador. Você já "está lá".

    
por 02.10.2014 / 07:05