bash ASCII 到十六进制

问题描述 投票:0回答:7

想知道是否有人可以帮助我在 bash 中将 ASCII 转换为十六进制。 示例代码:

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

我希望 hexval 具有以下值: 68656C6C6F(十六进制你好)

bash hex ascii
7个回答
53
投票
$ str="hello"
$ hex="$(printf '%s' "$str" | xxd -p -u)"
$ echo "$hex"
68656C6C6F

或者:

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

小心

'"%X"'
;它有单引号和双引号。


12
投票

您有多种选择

$ printf hello | xxd
0000000: 6865 6c6c 6f                             hello

另请参阅: bash 中的 Ascii/Hex 转换


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)的 wiki 页面 BashFAQ/071 中致力于 char-ASCII 转换的许多其他精彩实用程序一起详细公开。


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
投票

仅十六进制行输出。已测试,两个系统均已验证。

# Linux
$ echo -n 'hello' | hexdump -ve '/1 "%02x"'
68656c6c6f
# Mac
$ echo -n 'hello' | xxd -p -c 256
68656c6c6f

0
投票

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 上测试。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.