Eu tenho um arquivo binário que é preenchido com FF
valores. Preenchi seu início com muitos arquivos \000
. Em seguida, preenchi seu início com 10 \000
, a fim de obter algum tipo de deslocamento e, em seguida, escrevi uma string mais curta, também terminada com\000
Eu usei isso printf
:
printf \000\000\000\000\000\000\000\000\000\000MAC_ADDRESS=12:34:56:78:90,PCB_MAIN_ID=m/SF-1V/MAIN/0.0,PCB_PIGGY1_ID=n/SF-1V/PS/0.0,CSL_HW_VARIANT=D\000' > eeprom
É assim que fica quando mostro o hexdump do arquivo
Agora o que eu quero saber é como posso ler a string. Posso usar MY_STR=${eeprom:OFFSET}
( eeprom
é o nome do arquivo) que me dará a string, mas também me dará o resto do arquivo que não quero. Como posso pará-lo quando ele encontra pela primeira vez \000
?
- Não é possível usar
MY_STR=${eeprom:OFFSET:LENGTH}
porque o comprimento da string é desconhecido - Outra coisa - como posso preenchê-lo novamente
FF
? - Usando
sh
(caixa ocupada)
EDITAR
Tentando fazer um pequeno exemplo disso ... Eu tenho um arquivo input
com esses valores (depois de xxd -c 1 input
):
0000000: 68 h
0000001: 65 e
0000002: 6c l
0000003: 6c l
0000004: 6f o
0000005: 2c ,
0000006: 20
0000007: 00 .
0000008: 69 i
0000009: 74 t
000000a: 27 '
000000b: 73 s
000000c: 20
000000d: 6d m
000000e: 65 e
000000f: 2c ,
0000010: 00 .
e eu tenho esse script s.sh
:
BUF=""
for c in $(xxd -p input); do
if [ "${c}" != 00 ]; then
BUF="$BUFc";
else
break;
fi
done
echo $BUF
e eu esperava que ecoasse "olá", porém, nada é impresso
Solução 1: Atribuição direta de variável
Se tudo o que o preocupa são os bytes nulos, você deve ser capaz de ler diretamente os dados do arquivo em uma variável usando qualquer método padrão de sua preferência, ou seja, você deve ser capaz de simplesmente ignorar os bytes nulos e ler os dados do arquivo. Aqui está um exemplo usando o
cat
comando e a substituição de comando:Isso funcionou para mim dentro de um contêiner BusyBox Docker.
Solução 2: Usando
xxd
e umfor
loopSe você quiser mais controle do que pode usar
xxd
para converter os bytes em strings hexadecimais e iterar sobre essas strings. Então, ao iterar sobre essas strings, você pode aplicar qualquer lógica que desejar, por exemplo, você pode pular explicitamente os valores nulos iniciais e imprimir o restante dos dados até atingir alguma condição de interrupção.Aqui está um script que especifica uma "lista branca" de caracteres válidos (ASCII 32 a 127), trata qualquer subsequência de outros caracteres como um separador e extrai todas as substrings válidas:
Agora podemos testar isso criando um arquivo de exemplo que tenha subsequências
\x00
e separando substrings:\xff
E aqui está a saída que obtemos ao executar o script:
Solução 3: usando os comandos
tr
ecut
Você também pode tentar usar os comandos
tr
ecut
para lidar com os bytes nulos. Aqui está um exemplo de extração da primeira string terminada em nulo de uma lista de strings terminadas em nulo, apertando/recolhendo caracteres nulos adjacentes e convertendo-os em novas linhas: