我有很多这种字符串,我想找到一个命令将其转换为ascii,我尝试使用
echo -e
和od
,但它不起作用。
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
这对我有用。
$ echo -n 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$
echo -n
防止将换行符添加到末尾
-r
告诉它将十六进制转换为 ascii,而不是执行相反操作的正常模式
-p
告诉它使用纯格式。
此代码会将文本
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 将十六进制数据转换为二进制(类似于反向十六进制转储)。 xxd 要求每行以该行第一个字符的索引号开始(对某些内容运行 hexdump 并查看每行如何以索引号开始)。 在我们的例子中,我们希望该数字始终为零,因为每次执行只有一行。 幸运的是,我们的数据在每个字符之前已经有零作为 0x 表示法的一部分。 小写的 x 会被 xxd 忽略,所以我们所要做的就是将每个 0xhh 字符通过管道传输到 xxd 并让它完成工作。
tr 将句点转换为空格,以便 for 能够正确地将其分割。
您可以使用
xxd
:
$cat hex.txt
68 65 6c 6c 6f
$cat hex.txt | xxd -r -p
hello
你可以使用这样的东西。
$ 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
输出将产生一些可打印字符和一些不可打印字符,如下所示:
使用
echo
命令将十六进制值转换为纯文本:
echo -e "\x<hex value here>"
使用
echo
命令将 UTF-8 值转换为纯文本:
echo -e "\u<UTF-8 value here>"
然后使用
echo
命令将八进制转换为明文:
echo -e "\0<octal value here>"
当您有不熟悉的编码值时,请花点时间检查常见编码方案中的范围,以确定值属于什么编码。然后从那里进行转换就可以了。
由于错误的转义,
echo -e
一定对你来说失败了。
以下代码对我来说在 your_program with arguments
的类似输出上运行良好:
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')
但请注意,您的原始十六进制字符串包含不可打印的字符。
制作这样的脚本:
bash
#!/bin/bash
echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4))
示例:
sh converthextoip.sh c0 a8 00 0b
结果:
192.168.0.11