Unix: Usando o Comando xxd em um arquivo ppm

3

Sou relativamente novo em unix e estou tendo problemas para entender o que alguns dos comandos fazem. Por exemplo, quando eu uso xxd em um arquivo ppm (ou seja, xxd image.ppm ), recebo uma saída como esta:

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
00000010: 6137 5966 3958 6939 566a 3953 6739 5464  a7Yf9Xi9Vj9Sg9Td
00000020: 3b57 643a 5763 3654 6335 5161 334e 5c30  ;Wd:Wc6Tc5Qa3N
00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
00000010: 6137 5966 3958 6939 566a 3953 6739 5464  a7Yf9Xi9Vj9Sg9Td
00000020: 3b57 643a 5763 3654 6335 5161 334e 5c30  ;Wd:Wc6Tc5Qa3N%pre%
00000030: 4f5a 3250 5d35 5361 3556 6334 5561 3352  OZ2P]5Sa5Vc4Ua3R
00000040: 5e32 515d 3256 6035 5b64 3856 6136 4a55  ^2Q]2V'5[d8Va6JU
...
...
00000030: 4f5a 3250 5d35 5361 3556 6334 5561 3352 OZ2P]5Sa5Vc4Ua3R 00000040: 5e32 515d 3256 6035 5b64 3856 6136 4a55 ^2Q]2V'5[d8Va6JU ... ...

Alguém pode me explicar o que esta saída representa?

    
por Shoaib Ahmed 04.02.2018 / 17:33

2 respostas

6

As três partes são o deslocamento desde o início da entrada, em hexadecimal; os dados em hexadecimal; e os dados em caracteres, se forem imprimíveis. 16 bytes para uma linha, já que é um bom número redondo e se encaixa perfeitamente em uma tela.

Uma exibição como essa é muito usada em casos em que os dados binários e textuais podem ser importantes. Por exemplo. tcpdump -X usa um semelhante.

Na sua primeira linha:

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U

O offset 00000000 é zero, já que este é o começo; 50 , 36 e 0a são os códigos de caracteres para P , 6 e a nova linha e assim por diante. Caracteres não imprimíveis são impressos como pontos na coluna da direita.

Observe que, em algumas variantes, os bytes na seção intermediária podem estar "invertidos" dentro de cada grupo. Isso acontece se o programa interpreta a entrada como números little-endian e os exibe como tal, em vez de como bytes individuais concatenados.

xxd -e faz exatamente isso. Considere:

$ printf  "ABCD" | xxd -e -g2 
00000000: 4241 4443                                ABCD

41 para A e 42 para B aparecem em ordem invertida, bem como os outros dois. od do GNU coreutils também inverte os bytes dentro dos grupos. Em caso de dúvida, verifique novamente ou tente obter um agrupamento um por um. (compare, por exemplo, od -x e od -tx1 neste documento.)

Naturalmente, o significado dos dados em si pode ser encontrado na documentação do formato ppm. Meu sistema tem a página man ppm(5) . (a versão online do no die.net quebrou a formatação.)

A partir dessa primeira linha, podemos dizer que é uma imagem RGB de tamanho 111x132 pixels com 8 bits por amostra.

    
por 04.02.2018 / 17:47
4

É um dump hexadecimal, em um formato hexdump bastante comum, com cada linha de saída contendo o deslocamento de bytes (em hexadecimal *), dígitos hexadecimais para 16 bytes e a representação ASCII desses mesmos bytes.

* Observe como o deslocamento de byte é incrementado por 0x10 hexadecimais (16 decimais) para cada linha.

De man xxd :

NAME

   xxd - make a hexdump or do the reverse.

SYNOPSIS

   xxd -h[elp]
   xxd [options] [infile [outfile]]
   xxd -r[evert] [options] [infile [outfile]]

DESCRIPTION

xxd creates a hex dump of a given file or standard input. It can also convert a hex dump back to its original binary form. Like uuencode(1) and uudecode(1) it allows the transmission of binary data in a 'mail-safe' ASCII representation, but has the advantage of decoding to standard output. Moreover, it can be used to perform binary file patching. [...]

Os dumps hexadecimais são extremamente úteis quando você precisa saber exatamente quais bytes estão em um arquivo em algum local exato. Eles podem ajudar a diagnosticar problemas onde, por exemplo, há bytes inesperados (por exemplo, NULs ( 0x00 ) ou retornos de carro ( 0x0D )) no arquivo e, como @ilkkachu menciona em sua resposta se o formato de arquivo binário está documentado (ou você o conhece de qualquer maneira), muitas vezes é possível interpretar significados específicos para bytes em deslocamentos específicos (locais).

    
por 04.02.2018 / 17:40

Tags