在 bash 命令行中将十六进制字符串转换为 ascii

我有很多这样的字符串,我想找到一个命令来转换它在 ascii,我尝试与 echo -eod,但它不工作。

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
242888 次浏览

此代码将文本 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2转换为具有等效值的11字节流。这些字节将被写入标准输出。

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
echo $c | xxd -r
done

正如其他人指出的那样,这将不会产生可打印的 ASCII 字符串,原因很简单,指定的字节不是 ASCII。你需要张贴更多关于你如何获得这个字符串的信息,我们会帮助你。

它是如何工作的: xxd-r 将十六进制数据转换为二进制数据(类似于反向 hexdump)。Xxd 要求每一行以行中第一个字符的索引号开始(对某些内容运行 hexdump,查看每一行是如何以索引号开始的)。在我们的示例中,我们希望该数字始终为零,因为每次执行只有一行。作为0x 表示法的一部分,我们的数据已经在每个字符前面都有零了。小写的 x 被 xxd 忽略,所以我们要做的就是把每个0xhh 字符导入 xxd,让它来完成这项工作。

Tr 将句点转换为空格,以便 for 将其正确分割。

echo -e一定是因为错误的逃逸而失败了。 下面的代码对于我来说在 your_program with arguments的类似输出上工作得很好:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

但是请注意,您的原始 hexstring 由不可打印的字符组成。

这招对我很管用。

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r告诉它把十六进制转换成亚西里,而不是它的正常模式做相反的事情

-p告诉它使用普通格式。

你可以用这个。

$ cat test_file.txt
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e


$ for c in `cat test_file.txt`; do printf "\x$c"; done;
This is text data.
One more line of test data.

您提供的值是 UTF-8值:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2)

将被解析以打印每个值的明文字符。

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done

输出将生成一些可打印字符和一些不可打印字符,如下所示:

enter image description here

用于使用 echo命令将十六进制值转换为明文:

echo -e "\x<hex value here>"

以及使用 echo命令将 UTF-8值转换为明文:

echo -e "\u<UTF-8 value here>"

然后使用 echo命令将八进制转换为明文:

echo -e "\0<octal value here>"

当您有不熟悉的编码值时,请花些时间查看常见编码模式中的范围,以确定值所属的编码。然后从那里转换是一个快照。

写一个这样的剧本:

bash
#!/bin/bash


echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4))

例如:

sh converthextoip.sh c0 a8 00 0b

结果:

192.168.0.11

你可以使用 xxd:

$cat hex.txt
68 65 6c 6c 6f
$cat hex.txt | xxd -r -p
hello