我想将二进制文件转换为十六进制的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”没有为ascii值“0”返回“30”。同样,问题的真正症结在于我只想使用Bash,因为我无法保证任何人除了Bash之外还有其他东西。更糟糕的是,我正在尝试使用Bash 3.x.任何建议都是最受欢迎的。
答案 0 :(得分:1)
如果字符前面有撇号,则使用字符的ASCII值。
printf "%02X" "'$filechar"
但我认为这不适用于非ASCII(> 127)字符。
答案 1 :(得分:0)
我想出了一种方法,尽管将文件加载到字符串中很糟糕。
#!/bin/sh
FILESTRING=$(<$1)
for ((i=0;i<${#FILESTRING};i++));
do
printf %02X \'${FILESTRING:$i:1};
done
在这种方法中,我不需要外部可执行文件,所以我不必担心Bash之外的任何事情。感谢所有评论的人。