我想知道是否有人能够帮我将ASCII转换为Bash中的十六进制。
示例代码:
#!/bin/bash
STR = "hello"
#Convert to hex
HEXVAL = $STR #(in hex here?)
我希望hexval的值为: 68656C6C6F(16进制下的hello)
我想知道是否有人能够帮我将ASCII转换为Bash中的十六进制。
示例代码:
#!/bin/bash
STR = "hello"
#Convert to hex
HEXVAL = $STR #(in hex here?)
我希望hexval的值为: 68656C6C6F(16进制下的hello)
$ str="hello"
$ hex="$(printf '%s' "$str" | xxd -p -u)"
$ echo "$hex"
68656C6C6F
或者:
$ hex="$(printf '%s' "$str" | hexdump -ve '/1 "%02X"')"
$ echo "$hex"
68656C6C6F
小心使用 '"%X"'
,它同时包含单引号和双引号。
纯BASH将字符串转换为可打印的十六进制序列,然后再转回字符串的转换器
str2hex_echo() {
# USAGE: hex_repr=$(str2hex_echo "ABC")
# returns "0x410x420x43"
local str=${1:-""}
local fmt="0x%x"
local chr
local -i i
for i in `seq 0 $((${#str}-1))`; do
chr=${str:i:1}
printf "${fmt}" "'${chr}"
done
}
hex2str_echo() {
# USAGE: ASCII_repr=$(hex2str_echo "0x410x420x43")
# returns "ABC"
echo -en "'${1:-""//0x/\\x}'"
}
解释
ASCII->hex:高效地将字符转换为其底层ASCII代码的秘密是在printf
中使用非字符串格式说明符时,将单引号或双引号作为下一个符号的底层ASCII代码的指令。这种行为在GNU BASH参考文档中有记录,但也在Greg(也称为GreyCat)的维基页面BashFAQ/071中详细介绍了许多其他出色的实用工具,专门用于字符ASCII转换。
seq
?为什么不直接使用 for ((i = 0; i < ${#str}; ++i))
? - Chris Pagefmt
而不是将格式字符串放在一行中?例如,printf '0x%x' "'${chr}"
。 - Chris Page这是一个一行代码(有点复杂但可以正常工作):
#!/bin/bash
echo '0x'"`echo $1 | hexdump -vC | awk 'BEGIN {IFS="\t"} {$1=""; print }' | awk '{sub(/\|.*/,"")}1' | tr -d '\n' | tr -d ' '`" | rev | cut -c 3- | rev
xxd -p -u <<< "$STR" | sed 's/\(..\)/0x&, /g; s/, $//;'
0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x0A
POSIX选项
我认为这个是POSIX的:
od-raw() {
od -A n -t x1 -v | tr -d ' \n'
}
使用方法:
printf hello | od-raw
输出:
68656c6c6f
或者如果您想要分开空格:
os-raw-spaces() {
od -A n -t x1 -v "$@" | tr -d '\n' | cut -c 2-
}
输出:
68 65 6c 6c 6f
在Ubuntu 22.04上进行了测试。
相关:
只有十六进制行输出。已测试,两个系统均验证通过。
# Linux
$ echo -n 'hello' | hexdump -ve '/1 "%02x"'
68656c6c6f
# Mac
$ echo -n 'hello' | xxd -p -c 256
68656c6c6f
0a
。 - deweydb0a
不应该出现在字符串的末尾。 - deweydbecho -n 'hello' | hexdump -ve '/1 "%02x"'
和 echo -n 'hello' | xxd -p -c 256
。参考链接:https://linux.die.net/man/1/echo - deweydb