passando dd skip | procura offset como hexadecimal

9
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

Por que o segundo comando gera um valor diferente?

É possível passar o deslocamento skip | seek para dd como um valor hexadecimal?

    
por eadmaster 05.08.2013 / 05:37

1 resposta

16

Por que o segundo comando gera um valor diferente?

Por motivos históricos, dd considera x como operador de multiplicação. Então, 0x3 é avaliado como 0.

É possível passar o deslocamento skip | seek para dd como um valor hexadecimal?

Não diretamente, tanto quanto eu sei. Além da multiplicação usando o operador x , você pode sufixar qualquer número com b para significar "multiplicar por 512" (0x200) e com K para "multiplicar por 1024" (0x400). Com o GNU dd você também pode usar os sufixos M , G , T , P , E , Z e Y para significar multiplicar por 2 à potência de 20, 30, 40, 50, 60, 70, 80 ou 90, respectivamente, e você pode usar maiúsculas ou minúsculas, exceto o sufixo b . (Existem muitos outros sufixos possíveis. Por exemplo, EB significa "multiplicar por 10 18 " e PiB significa "multiplicar por 2 50 ". Consulte info coreutils "block size" para mais informações, se você tiver uma instalação GNU.)

Você pode achar o acima arcano, anacrônico e nerd ao ponto do absurdo. Não se preocupe: você não está sozinho. Felizmente, você pode simplesmente ignorar tudo e usar a substituição aritmética do seu shell (bash e outros shells compatíveis com Posix funcionarão, assim como alguns shells não Posix). O shell entende números hexadecimais e permite uma gama completa de operadores aritméticos escritos da maneira normal. Você só precisa cercar a expressão com $((...)) :

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
    
por 05.08.2013 / 06:47

Tags