我需要将中文字符串转换为适当的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终端上运行
答案 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
的普通字符串或数组中的多字节字符