Um ambiente semelhante a shell para processamento binário


15

Esta pergunta me veio algumas vezes antes, agora em resposta à pergunta Loop através de blocos de dados binários de stdin no Bash Answers, fornecidos em /programming/993434/what-language-is-to-binary o -s-perl-is-to-text também não foi satisfatório.

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 completas (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 ...) para não mencionar eles são menos adequados para scripts (chamando outros aplicativos a partir dele). Perl não é melhor com suas unpackfunções, operação orientada a strings e sintaxe pateta.

Algo como od, mas como idioma.

O que eu espero:

  1. definir ou alterar endianness com um único switch / comando.
  2. simples especificação do tipo solicitado (algo semelhante que se estende bater read varcom int32 var, float varetc).
  3. manipulação de binários através de pipes, pulando o número especificado de bytes.
  4. controle de fluxo de script padrão (para / se / ...) com o qual estamos acostumados.

Gostaria de processar dados brutos (fotografia, dados científicos, formatos desconhecidos e mal documentados) com a mesma facilidade e percepção que você obtém ao inspecionar arquivos ASCII. Estou usando cagora, 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 com ssh, de outros scripts e assim por diante. "Não existe" é uma resposta aceitável, mas deprimente.


2
Não tira a dor do tempo de inicialização, mas acho os bytes do Python 3.3, juntamente com o plumbum, muito viáveis: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()Você já viu isso?
Anthon

Você pode pegar o código C que você possui agora e transformá-lo em um conjunto de ferramentas de linha de comando que você pode usar em um script bash. Enquanto você não pode colocar o binário em uma variável de shell, você pode escondê-lo em pipes nomeados ('fifo'); o conteúdo deles fica na memória até que você queira lê-los.
Goldilocks

1
Há uma falha séria no seu raciocínio WRT python e perl, BTW. Enquanto as ferramentas individuais de linha de comando são compiladas, os scripts de shell não são e envolvem muito uso de bifurcação (se você quiser caro, é bifurcação). Sua discussão, outra pergunta, etc, implica que você ficaria bem usando o bash aqui se ele pudesse lidar com binário. Python e scripts perl são ambos compilado-pre. Se você comparar um script python ou perl razoavelmente complexo versus um script bash paralelo, o perl ou python será uma ordem de magnitude mais rápido . Se você não acredita em mim, pode pesquisar na Web por evidências em contrário.
Goldilocks

Não estou procurando uma ferramenta que seja rápida, estou procurando algo que possa codificar rapidamente. Por exemplo, se eu tiver um programa estranho que gera um int binário para o tamanho da matriz de estruturas (int, float, float) que se seguem, gostaria de ler rapidamente o tamanho da matriz e fazer um loop sobre a matriz, possivelmente calculando alguns cumulativo ou máximo de alguns componentes ou apenas imprima um componente como coluna ascii para o processamento do gnuplot. Anthon: obrigado, eu não sabia disso, será útil. goldilocks: Eu estou tentando evitar isso, mas eu pode apenas escrever minha própria ferramenta no final :)
orion

2
Parece que você precisa de um tutorial sobre como usar perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Respostas:


2

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

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

Obviamente, é possível usar xxdantes e xxd -rdepois da edição dos 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 dispositivos de bloco.

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

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

ATUALIZAR

Por acaso, também uso o homebrew, o open source Intel x86 assembler flat assembler , ou fasm, que evoluiu para muito mais do que apenas um assembler.

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

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

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

Ele tem algumas arestas, como

  1. não suporta simultaneidade

  2. sendo gravado no assembly x86 de 32 bits (funciona no x86_64), você provavelmente precisará do qemu ou de um emulador similar se quiser executá-lo em qualquer outra coisa que não seja x86 ou x86_64

  3. sua poderosa linguagem de pré-processador macro está completa, significa que é melhor você 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 aumentar, mas não encolher, até que o arquivo de saída tenha sido gravado e terminado com fasm. Isso significa que só é possível gerar arquivos com o tamanho máximo de memória que resta em uma única etapa do fasm.

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

  6. sim, é homebrew, um muito legal e inteligente embora


2

Você não precisa necessariamente "fazer as pazes" com a descompactação de Perl ... uma das grandes coisas do 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 perl suficiente para escrever o pacote MyBinLib. Pergunte em um fórum Perl e as pessoas provavelmente ficariam felizes em ajudar.


1

Você já encontrou beavmacros, mas não consegui encontrar scripts,

apt-cache show beav extrair :

Com o beav, você pode editar um arquivo em HEX, ASCII, EBCDIC, OCTAL, DECIMAL e BINARY. Você pode exibir, mas não editar dados, no modo FLOAT. Você pode pesquisar ou pesquisar e substituir em qualquer um desses modos. Os dados podem ser exibidos nos formatos BYTE, WORD ou DOUBLE WORD. Enquanto exibem PALAVRAS ou DUPLA PALAVRA, os dados podem ser exibidos na ordem de bytes da INTEL ou da MOTOROLA. Dados de qualquer tamanho podem ser inseridos em qualquer ponto do arquivo. A fonte desses dados pode ser o teclado, outro buffer ou um arquivo. Todos os dados que estão sendo exibidos podem ser enviados para uma impressora no formato exibido. Arquivos maiores que a memória podem ser manipulados.

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


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.