Escrevendo valores hexadecimais em um arquivo (não como valores ascii) através da linha de comando

5

Eu queria saber se alguém sabia de um utilitário de linha de comando que me permitiria escrever diretamente valores hexadecimais em um arquivo. tal que quando um hexdump do arquivo é feito os valores que eu entro seriam cuspidos. É vital que eu escreva diretamente para hexadecimal, já que muitos dos valores que eu preciso escrever não possuem nenhum caractere equivalente a unicode ou ascii associado a eles. Procurando por algo como:

writehex f6050000 ac7e0500 02000800 01000000 newfile
hexdump newfile 
hexdump 1.02
ts.event.1
00000000: f6050000 ac7e0500 02000800 01000000 .....~..........
16 bytes read
    
por jcb344 22.10.2010 / 20:20

4 respostas

7

Esta função Bash deve funcionar para você:

writehex  ()
{
    local i
    while [ "$1" ]; do
        for ((i=0; i<${#1}; i+=2))
        do
            printf "\x${1:i:2}";
        done;
        shift;
    done
}

Implementação alternativa:

writehex  ()
{
    local arg, i
    for arg; do
        for ((i=0; i<${#arg}; i+=2))
        do
            printf "\x${arg:i:2}"
        done
    done
}

Para testar:

$ writehex abc00001ff | hexdump -C
00000000  ab c0 00 01 ff                                    |.....|
00000005

$ writehex f6050000 ac7e0500 02000800 01000000 | hexdump -C
00000000  f6 05 00 00 ac 7e 05 00  02 00 08 00 01 00 00 00  |.....~..........|
00000010

Outra opção seria usar xxd .

$ echo hello | xxd
0000000: 6865 6c6c 6f0a
$ echo hello | xxd | xxd -r
hello

Editar:

Além disso, você pode usar a opção -p para aceitar dados de entrada de forma livre:

$ echo 'f6050000 ac7e0500 02000800 01000000' | xxd -r -p | hexdump -C
00000000  f6 05 00 00 ac 7e 05 00  02 00 08 00 01 00 00 00  |.....~..........|
00000010

Editar 2:

Função modificada acima para manipular vários argumentos de entrada (sequências de dígitos hexadecimais separadas por espaços).

    
por 22.10.2010 / 21:02
2

com perl :

perl -ne '@a=split;for(@a){print chr(hex($_))}' inputfile > outputfile

Onde o conteúdo de inputfile está formatado:

42 43 44

outputfile conteria BCD . Você pode preparar seu arquivo de entrada em vi da seguinte forma:

:%s/ //g
:%s/\(.\{2\}\)/ /g

Isso removerá todos os espaços e, em seguida, inserirá um espaço entre todos os caracteres.

O exemplo que você deu usando essa perl line:

$ cat inputfile
f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00
$ hexdump outputfile
0000000 f6 05 00 00 ac 7e 05 00 02 00 08 00 01 00 00 00
0000010
    
por 22.10.2010 / 20:54
1

Que tal um editor hexadecimal, como hexedit ou hexer? Você pode editar diretamente o arquivo e digitar valores em hexadecimal com eles.

    
por 22.10.2010 / 20:43
0

Apenas tive o mesmo desafio e encontrei esta solução. Eu tentei ir com a solução de Dennis Williamson, mas foi muito lento quando implementado em uma operação em massa (tinha que converter ~ 60k sqlite blobs em arquivos). Eu criei uma reimplementação de writehex que eu queria compartilhar aqui:

writehex ()
{
  HEX=$(echo $1 | sed -re 's:([0-9A-F]{2}):\x:g')
  echo -e $HEX
}

Quando se trata de desempenho, o melhor é que ele usa apenas uma única chamada para sed e uma regex leve. Sua milhagem pode variar, mas eu achei muito mais rápido.

    
por 04.07.2018 / 14:39