1

我正在尝试获取具有十六进制数字的文件的内容并将该数字转换为二进制并输出到文件。

这是我正在尝试但没有得到二进制值的方法:

    xxd -r -p Hex.txt > Binary.txt

Hex.txt的内容是:ff

我也尝试过 FF 和 0xFF,但我只想使用 ff,因为我从中提取信息的设备具有这种格式。

而不是应该是 11111111 ,我得到了上面 2 个点的 y 。

如果我将其更改为 ee,我会得到一个带有 2 个点的 i。它似乎读得很好,但根据我在 xxd -r -p 命令上读到的内容,它没有以正确的格式输出。

我发现将十六进制转换为二进制的其他方法要么也不起作用,要么是一个相当大的 Bash 脚本,似乎没有必要做我认为简单的任务。

这也给了我带有 2 个点的 y。

    $ for i in $(cat Hex.txt) ; do printf "\x$i" ; done > Binary.txt

出于某种原因,我找到的几乎每个解决方案都给了我这种格式,而不是人类可读的二进制值,带有 1 和 0。

任何帮助表示赞赏。我计划在脚本中使用它来使用 curl 从 Digital Loggers 设备中提取继电器值,并为 Home Assistant 提供一个可读文件来记录继电器状态。Digital Loggers curl cmd 使用十六进制一次给出所有 8 个继电器的状态,而不是能够拉出特定继电器的状态。

4

1 回答 1

2

如果"file.txt"包含:

fe
0a

你运行这个:

perl -ane 'printf("%08b\n",hex($_))' file.txt

你会得到这个:

11111110
00001010

如果您经常使用它,您可能希望bash在您的登录配置文件中按照以下方式使用它 -非常尊重可能看起来不必要的空格和分号:

bin(){ perl -ane 'printf("%08b\n",hex($_))' $1 ; }

然后你就可以做到:

bin file.txt

如果你因为某种原因不喜欢 Perl,你可以在没有它的情况下达到类似的效果,如下所示:

tr '[:lower:]' '[:upper:]' < file.txt |
   while read h ; do
      echo "obase=2; ibase=16; $h" | bc
   done
于 2022-02-19T08:43:36.603 回答