给定一个二进制文件,如何在已安装的最小系统上仅使用sed
和等标准工具将其转换为十六进制字符串并返回?cut
busybox
这些工具是不是可用的:
perl
python
xxd
(vim自带)gcc
hexdump
自带一个命令busybox
,但是和自带的不一样util-linux
。
我正在寻找一个脚本或命令来将文件转换为十六进制字符串,以及相应的脚本或命令将其转换回二进制。中间格式不必是十六进制,它可以是 base64 或其他格式。
这适用于磁盘空间有限的嵌入式设备。
答案1
这是我想到的(基于几个在线资源和一些实验)。
从十六进制转换为二进制 ( hex2bin
):
#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' "$1" | xargs printf
从 bin 转换为 hex ( bin2hex
):
#!/bin/sh
hexdump -v -e '1/1 "%02x"' "$1"
使用示例:
./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2
这适用于 busybox,但遗憾的是 hex2bin 受到 给定参数的最大长度的限制xargs
,因此此方法仅适用于小文件(在我的桌面系统上小于 32 KiB)。
答案2
POSIXly(并且仅使用兼容的公共子集busybox
(或至少是busybox
为当前busybox
Debian 软件包构建的):
bin2hex
:( export LC_ALL=C od -An -vtx1 | tr -s ' \t\n' '\n\n\n' | grep . )
(每行一个十六进制)
hex2bin
:( export LC_ALL=C awk ' BEGIN{ for (i = 0; i < 256; i++) c[sprintf("%02x", i)] = sprintf("%o", i) } NR % 200 == 1 {printf "%s", end "printf '\''"; end = "'\''\n"} {printf "\\%s", c[$0]} END {print end}' | sh )
如果您的busybox
与 Debian 的相反,是在没有桌面选项,则-An
和-tx1
选项将od
不可用。您可以使用od -b
它来代替,它将提供带有八进制偏移量的一字节八进制转储。od -b
是 Unix 但不是 POSIX,所以不能在所有类 Unix 系统上工作。
bin2hex
会成为:
(
export LC_ALL=C
od -b |
awk '
BEGIN{
for(i = 0; i < 256; i++)
hex[sprintf("%03o", i)] = sprintf("%02x", i)
}
NF > 1 {for (i = 2; i<= NF; i++) print hex[$i]}'
)
再次强调,仅使用 Debian 的 busybox 进行测试,我无法判断其中有多少依赖于某些busybox
编译时选项或其他选项。您必须在目标系统上进行测试。
答案3
您的 busybox 可能是用小程序构建的64位基数所以你可以做
busybox base64 <bin >txt
busybox base64 -d <txt >bin
或者,如果没有,您可能会拥有令人尊敬的uu编码和乌德码,也可以选择-m
以十六进制编码。例如
echo -n abcABC | busybox uuencode -m - | busybox uudecode -
列出带有 的内置小程序busybox --list
。