Bash ASCII转十六进制

34

我想知道是否有人能够帮我将ASCII转换为Bash中的十六进制。

示例代码:

#!/bin/bash 
STR = "hello"
#Convert to hex
HEXVAL = $STR #(in hex here?)

我希望hexval的值为: 68656C6C6F(16进制下的hello)


1
欢迎来到stackoverflow。你已经尝试过什么了吗? 如果在提问前展示一些研究努力,人们更愿意提供帮助。否则,你会被视为求助吸血鬼 - JMax
可能是 https://dev59.com/om025IYBdhLWcg3w6aUX 的重复问题。 - mrchampe
7个回答

50
$ str="hello"
$ hex="$(printf '%s' "$str" | xxd -p -u)"
$ echo "$hex"
68656C6C6F

或者:

$ hex="$(printf '%s' "$str" | hexdump -ve '/1 "%02X"')"
$ echo "$hex"
68656C6C6F

小心使用 '"%X"',它同时包含单引号和双引号。


1
在“xxd V1.10 27oct98”中,我必须使用“xxd -p -u”。 - mja
"xxd -pu" 对我有用,但我想提一下另一个建议的输出完全不同。 - Serge
hexdump 每次读取 4 个字节,因此 "6C6C6568A6F" 是不正确的。它应该是 "lleho"。 - Hedgehog
@Hedgehog 哇,还有哎呀!我已经修复了这两个例子。 - John Kugelman

11

4

纯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”不是纯Bash!但我有一个用纯Bash编写的简化“seq”函数 :-) - anthony
为什么要使用 seq?为什么不直接使用 for ((i = 0; i < ${#str}; ++i)) - Chris Page
为什么要使用fmt而不是将格式字符串放在一行中?例如,printf '0x%x' "'${chr}" - Chris Page
由于Unicode字符处理出现为utf16十六进制代码,这将会导致失败。 - anthony

1

这是一个一行代码(有点复杂但可以正常工作):

#!/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

1
xxd -p -u <<< "$STR" | sed 's/\(..\)/0x&, /g; s/, $//;'

0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x0A


0

0

只有十六进制行输出。已测试,两个系统均验证通过。

# Linux
$ echo -n 'hello' | hexdump -ve '/1 "%02x"'
68656c6c6f

# Mac
$ echo -n 'hello' | xxd -p -c 256
68656c6c6f

字符串末尾不应该有0a - deweydb
0a 不应该出现在字符串的末尾。 - deweydb
@deweydb 怎么重写我的解决方案? - storenth
1
尝试运行以下命令:echo -n 'hello' | hexdump -ve '/1 "%02x"'echo -n 'hello' | xxd -p -c 256。参考链接:https://linux.die.net/man/1/echo - deweydb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接