我有一个充满FF
值的二进制文件。我用许多\000
. 然后,我用 10 填充它的开头\000
,以获得某种偏移量,然后我写了一个较短的字符串,也以\000
我用这个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
这就是我显示文件的 hexdump 时的样子
现在我想知道的是如何读取字符串。我可以使用MY_STR=${eeprom:OFFSET}
(eeprom
是文件名) 这会给我字符串,但也会给我我不想要的文件的其余部分。当它第一次遇到时,我该如何阻止它\000
?
- 无法使用
MY_STR=${eeprom:OFFSET:LENGTH}
,因为字符串的长度未知 - 另一件事 - 我怎样才能再次填满它
FF
? - 使用
sh
(忙箱)
编辑
试图做一些小例子......我有一个input
包含这个值的文件(在 之后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 .
我有这个脚本s.sh
:
BUF=""
for c in $(xxd -p input); do
if [ "${c}" != 00 ]; then
BUF="$BUFc";
else
break;
fi
done
echo $BUF
我希望它会回显“你好”,但是没有打印任何内容
解决方案 1:直接变量赋值
如果您担心的是空字节,那么您应该能够使用您喜欢的任何标准方法将文件中的数据直接读取到变量中,即您应该能够忽略空字节并读取数据从文件中。
cat
这是使用命令和命令替换的示例:这在 BusyBox Docker 容器中对我有用。
解决方案 2:使用
xxd
和for
循环如果您想要更多的控制权,可以
xxd
用来将字节转换为十六进制字符串并遍历这些字符串。然后,在遍历这些字符串时,您可以应用您想要的任何逻辑,例如,您可以显式跳过初始空值并打印其余数据,直到达到某个中断条件。这是一个脚本,它指定有效字符(ASCII 32 到 127)的“白名单”,将其他字符的任何子序列视为分隔符,并提取所有有效子字符串:
现在我们可以通过创建一个示例文件来测试这一点,该文件具有分隔子字符串的子序列
\x00
和子序列:\xff
这是我们在运行脚本时得到的输出:
解决方案 3:使用
tr
andcut
命令您也可以尝试使用
tr
andcut
命令来处理空字节。这是一个通过挤压/折叠相邻的空字符并将它们转换为换行符从以空字符结尾的字符串列表中提取第一个以空字符结尾的字符串的示例: