【问题标题】:Bash, converting byte to ascii hex without hexdump or xxdBash,在没有 hexdump 或 xxd 的情况下将字节转换为 ascii hex
【发布时间】: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


【解决方案1】:

如果字符前面有撇号,则使用字符的 ASCII 值。

printf  "%02X" "'$filechar"

但是,我认为这不适用于非 ASCII (> 127) 字符。

【讨论】:

    【解决方案2】:

    我想出了一个办法,虽然把文件加载到一个字符串中很糟糕。

    #!/bin/sh
    FILESTRING=$(<$1)
    for ((i=0;i<${#FILESTRING};i++));
    do 
       printf %02X \'${FILESTRING:$i:1};
    done
    

    在这种方法中,我不需要外部可执行文件,因此我不必担心 Bash 之外的任何事情。感谢所有评论的人。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2011-08-09
      • 2022-01-04
      • 1970-01-01
      • 2017-07-12
      • 2019-09-13
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多