在 bash 中打印字符的十六进制值

在 bash 中打印字符的十六进制值

在 C 中,printf ("%2X\n", 'A');打印41

在 bash 中,printf "%2X\n" 'A'打印bash: printf: A: invalid number

我怎样才能像在C 中那样41使用 进行打印?printfbash

请不要建议使用外部工具,od因为这太慢了:我正在寻找一种 bash 内部方法。

答案1

printf在 bash 手册中,你会发现:

论据非字符串格式说明符被视为 C 语言常量,但允许使用前导加号或减号,并且如果前导字符是单引号或双引号,则该值为后续字符的 ASCII 值。

(我强调)


这些 shell 函数封装了 char_to_hex 和 hex_to_char。函数名来自 perl

# ord: the ascii value of a character
# $ ord "A" #=> 65
#
ord() {
    printf "%d" "\"$1"
}

# chr: the character represented by the given ASCII decimal value
# $ chr 65 #=> A
#
chr() {
    printf "\x$(printf "%x" "$1")"
}

然后:

$ ord A
65
$ printf '%02X\n' "$(ord A)"
41

答案2

虽然很短,但@Juergen 评论说这回答了他的问题。使用以下内容:

printf "%X\n" \"A\"

注意,这提供了单字节(“ASCII”,UTF-8)字符代码。请参阅Unix 和 Linux StackExchange有关 char -> hex 值和逆 hex -> char 的更多信息,请使用 bash shell 和/或 python。

相关内容