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 unpack
funções, operação orientada a strings e sintaxe pateta.
Algo como od
, mas como idioma.
O que eu espero:
- definir ou alterar endianness com um único switch / comando.
- simples especificação do tipo solicitado (algo semelhante que se estende bater
read var
comint32 var
,float var
etc). - manipulação de binários através de pipes, pulando o número especificado de bytes.
- 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 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 com ssh, de outros scripts e assim por diante. "Não existe" é uma resposta aceitável, mas deprimente.
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
Você já viu isso?perl
'sunpack
(ᵔᴥᵔ)Respostas:
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
xxd
antes exxd -r
depois 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
não suporta simultaneidade
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
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.
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.
os dados podem ser gravados apenas em um único arquivo de saída para cada execução do fasm
sim, é homebrew, um muito legal e inteligente embora
fonte
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?
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.
fonte
Você já encontrou
beav
macros, mas não consegui encontrar scripts,apt-cache show beav
extrair :Depois, há o
xxd
que converte para / do modo de exibição binário / ascii e pode ser combinado comsed
orvi
, mas não possui o recurso de troca de bytes.fonte
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á.
fonte