Use dd
ou xxd
(parte do Vim), por exemplo, para ler um byte ( -l
) no deslocamento 100 ( -s
) do arquivo binário try:
xxd -p -l1 -s 100 file.bin
para usar deslocamentos hexadecimais, no Bash você pode usar essa sintaxe $((16#64))
, por exemplo:
echo $((16#$(xxd -p -l1 -s $((16#FC)) file.bin)))
que lê byte no deslocamento FC
e imprime em formato decimal.
Como alternativa, use dd
, como:
dd if=file.bin seek=$((16#FC)) bs=1 count=5 status=none
que fará o dump dos dados brutos de 5 bytes no deslocamento hexadecimal FC
.
Depois, você pode atribuí-lo à variável, mas não funcionará quando seus dados tiverem bytes nulos , portanto, você pode pulá-los ( xxd -a
) ou como solução alternativa você pode armazená-los em formato hexadecimal simples.
Por exemplo:
-
Leia 10 bytes no deslocamento 10 na variável que contém bytes no formato hexadecimal:
hex=$(xxd -p -l 10 -s 10 file.bin)
-
Em seguida, escreva-os em arquivo ou dispositivo:
xxd -r -p > out.bin <<<$hex
Aqui estão algumas funções úteis no Bash:
set -e
# Read single decimal value at given offset from the file.
read_value() {
file="$1"
offset="$2"
[ -n "$file" ]
[ -n "$offset" ]
echo $((16#$(xxd -p -l1 -s $offset "$file")))
}
# Read bytes in hex format at given offset from the file.
read_data() {
file="$1"
offset="$2"
count="$3:-1"
xxd -p -l $count -s $offset "$file"
}
Uso da amostra:
read_value file.bin $((16#FC)) # Read 0xFC offset from file.bin.