在 UNIX shell 脚本中将 ascii 代码转换为十六进制

在 UNIX shell 脚本中将 ascii 代码转换为十六进制

我想将 ASCII 代码(如-or_.等)转换为 Unix shell 中的十六进制表示形式(无需bc命令),例如 : -=> %2d

有任何想法吗?

答案1

有一个printf模拟C函数的工具;通常它位于/usr/bin/printf,但是很多 shell 也为其实现了内置函数。您可以使用它%02x来获取字符的十六进制表示形式,但需要确保传递的字符串包含单引号中的字符 (编辑:事实证明只需在开头加一个单引号就足够了):

printf "%%%02x\n" "'-"   # Outputs %2d

为了方便起见,您可以创建一个 shell 函数:

function hex() {
    printf "%%%02x\n" "'$1"
}

hex -   # Outputs %2d
hex _   # Outputs %5f
hex .   # Outputs %2e

答案2

xxdvim-common是作为包的一部分提供的十六进制转储实用程序
它有一个方便的选项,可以输出连续的“plain/postscript”十六进制转储样式。这可以通过...-p轻松反转...将输出大写的十六进制数字。-r-u

$ echo -n "M" |xxd -p    # 1 ASCII char= 1 UTF-8 byte; Unicode Codepoint: U+0041
4d

$ echo -n "〶" |xxd -p -u # 1 CJK char= 3 UTF-8 bytes; Unicode Codepoint: U+3036  
E380B6

$ echo -n "Dump a string" |xxd -p -u  
44756D70206120737472696E67

$ echo -n "Dump and Revert" |xxd -p |xxd -r  
Dump and Revert

答案3

尝试OD:

$ echo -n "-_." | od -A n -t x1
2d 5f 2e

-A n表示不打印偏移量,-t x1表示将输出格式化为 1 字节十六进制整数。

相关内容