使用sed命令将String转换为HEX

时间:2018-02-05 04:46:27

标签: bash sed terminal

我需要将中文字符串转换为适当的HEX格式。我可以通过以下方式使用sed来实现它

echo -n 欢迎 | xxd -p -u | sed 's/.\{2\}/&\\x/g' | sed 's/^\(.\{0\}\)/\1\\x/' | sed -r 's/(.*)\\x/\1 /'

给出了输出:

\xE6\xAC\xA2\xE8\xBF\x8E

这是我正在寻找的正确答案。请建议我在上面的命令中更有效地使用sed。上面的命令正在ubuntu 16.04终端上运行

2 个答案:

答案 0 :(得分:0)

您可以使用";":

链接sed命令
 echo -n 欢迎 | xxd -p -u | sed 's/.\{2\}/&\\x/g;s/^\(.\{0\}\)/\1\\x/' | sed -r 's/(.*)\\x/\1 /'
\xE6\xAC\xA2\xE8\xBF\x8E 

由于你使用sed和sed -r进行交换,你必须修改第二个剩余的sed调用,以合并其余的调用:

echo -n 欢迎 | xxd -p -u | sed 's/.\{2\}/&\\x/g;s/^\(.\{0\}\)/\1\\x/;s/\(.*\)\\x/\1 /'

再看看它,xxd的输出没有sed,我发现,解决方案更容易:

echo -n 欢迎 | xxd -p -u | sed -r 's/(..)/\\x\1/g'

您的初始方法会将\ x附加到2个字符,但您可以在它之前添加。但是,链接多个sed命令可能仍然是一件有用的事情。

答案 1 :(得分:0)

从效率的角度来看,我能提出的最佳选择是用xdd和2个bash参数替换sed,3个管道和3个od来电扩展。 (可能有更有效的方式,但这是我想到的)

例如,您可以将命令替换$(printf "欢迎" | od -A none -t x1)的结果分配给包含' e6 ac a2 e8 bf 8e'的变量。然后,只需转换为大写,然后使用'space''\x'的子字符串替换(两者都由bash 参数扩展提供,例如。

a=$(printf "欢迎" | od -A none -t x1); \
a=${a^^}; \
a=${a// /\\x}; \
echo $a
\xE6\xAC\xA2\xE8\xBF\x8E

(如上面的续行所示,您只需复制/粘贴到您的终端进行测试)

来自您对C的评论中的请求

C中用于输出字符串中包含的大写十六进制字节的代码是微不足道的,例如。

#include <stdio.h>

int main (void) {

    char *s = "欢迎";

    while (*s)  /* output each byte in upper-case hex */
        printf ("\\x%hhX", ((unsigned char)*s++));
    putchar ('\n');

    return 0;
}

示例使用/输出

$ ./bin/str2hexbytes
\xE6\xAC\xA2\xE8\xBF\x8E

注意:您可以使用stdint.h中的确切宽度类型和inttypes.h中提供的精确宽度格式说明符更正式的解决方案,但它会完成同样的事情。同样,你可以使用宽字符类型,但几乎所有现代编译器都没有问题处理char的普通字符串或数组中的多字节字符