【发布时间】:2016-11-19 08:57:47
【问题描述】:
我想将二进制文件转换为十六进制的 ASCII 表示。这实际上是由于在分享我的学术作品时出现了一个奇怪的可移植性问题。动机是更容易将文件以十六进制表示为以 ASCII 打印的大值。我有一个独特的情况,我有 BASH,但可能没有 xxd 或 hexdump。我试图制作一个 bash 脚本,它接收一个文件,读取一个字节,然后将一个值输出为 ASCII 十六进制。我认为 printf 是要走的路,但如果文件有二进制 0x30,它会打印出 ASCII“0”。
#!/bin/sh
INPUTFILE=$1
while IFS= read -r -n1 filechar
do
printf "%02X" "$filechar"
done < "$INPUTFILE"
printf "\n"
我不清楚为什么“%02X”没有为“0”的 ascii 值返回“30”。同样,问题的真正症结在于我试图只使用 Bash,因为我不能保证除了 Bash 之外任何人都拥有任何东西。更糟糕的是,我正在尝试使用 Bash 3.x。任何建议都将受到欢迎。
【问题讨论】:
-
打印
0的原因是因为它正在读取的值。您正在从文件中读取每个字符,因此filechar值的值为 0。printf二进制文件不会将您传递给它的字符解释为数字。不能用od -tx $INPUTFILE吗?那应该是 POSIX 友好的。 -
@eddiem 也许吧。想象一个安全到无法使用的系统。这就是为什么我试图在 bash 中做所有事情,因为它是有效的。这只是一场管道噩梦。 “od”是一个不错的选择,因为它一直存在。直到你提到它,我才知道 od。我会问管理员是否可以确定每个人都可以运行它。
-
您会遇到一些字符值的问题:字符 0(ASCII NULL)不能在 shell 变量中表示或作为参数传递,超过 127(十六进制 7f)的字符可能会出现问题,具体取决于您的语言环境。
标签: bash