Convertendo de binário para hexadecimal e vice-versa

5

Dado um arquivo binário, como você o converte para uma string hexadecimal e vice-versa, usando apenas ferramentas padrão como sed e cut , em um sistema mínimo com busybox instalado?

Estas ferramentas não estão disponíveis :

  • perl
  • python
  • xxd (vem com o vim)
  • gcc

Um comando hexdump vem com busybox , mas é diferente daquele que vem com util-linux .

Estou procurando um script ou comando para converter um arquivo em uma cadeia hexadecimal e um correspondente para convertê-lo de volta em binário. O formato intermediário não precisa ser hexadecimal, pode ser base64 ou qualquer outra coisa.

Isto é para um dispositivo incorporado com espaço em disco limitado.

    
por Alexander 20.03.2017 / 10:36

3 respostas

5

Veja o que eu criei (com base em várias fontes on-line e algumas experiências).

Convertendo do hex para o bin ( hex2bin ):

#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\x/gI' "$1" | xargs printf

Convertendo de bin para hexadecimal ( bin2hex ):

#!/bin/sh
hexdump -C "$1" | cut -b9- | cut -d"|" -f1 | tr -d ' \t\n\r'

Exemplo de uso:

./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2

Isso funciona com o busybox, mas infelizmente o hex2bin é limitado pelo comprimento máximo do argumento dado a xargs , então este método só funcionará para arquivos pequenos (menos de 32 KiB no meu sistema desktop).

    
por 20.03.2017 / 10:36
3

POSIXly (e usando somente um subconjunto comum compatível com busybox (ou pelo menos o busybox como criado para o pacote atual busybox Debian):

  • bin2hex :

    (
      export LC_ALL=C
        od -An -vtx1 |
        tr -s ' \t\n' '\n\n\n' |
        grep .
    )
    

    (um hex por linha)

  • hex2bin :

    (
      export LC_ALL=C
        awk '
          BEGIN{
            for (i = 0; i < 256; i++)
              c[sprintf("%02x", i)] = sprintf("%o", i)
          }
          NR % 200 == 1 {printf "%s", end "printf '\''"; end = "'\''\n"}
          {printf "\%s", c[$0]}
          END {print end}' |
        sh
    )
    

Se o seu busybox , ao contrário do Debian, foi construído sem a opção DESKTOP , então a opção -An e -tx1 para od não estará disponível. Você pode usar od -b em vez disso, o que dará um octal dump de um byte com offsets octal. od -b é Unix, mas não POSIX, portanto não funciona em todos os sistemas Unix.

bin2hex se tornaria:

(
  export LC_ALL=C
    od -b |
    awk '
      BEGIN{
        for(i = 0; i < 256; i++)
          hex[sprintf("%03o", i)] = sprintf("%02x", i)
      }
      NF > 1 {for (i = 2; i<= NF; i++) print hex[$i]}'
)

Mais uma vez, testado apenas com o busybox do Debian, não sei dizer quanto disso depende da opção busybox de tempo de compilação ou de outra. Você teria que testar no sistema de destino.

    
por 20.03.2017 / 12:32
2

Seu busybox pode ter sido construído com o applet base64 para que você possa fazer

busybox base64 <bin >txt
busybox base64 -d <txt >bin

Ou, se não, você pode ter o venerável uuencode e o uudecode , que também podem ter a opção -m para codificar em hexadecimal. Por exemplo

echo -n abcABC | busybox uuencode -m - | busybox uudecode - 

Listar os applets integrados com busybox --list .

    
por 20.03.2017 / 12:15