在 bash 中我可以调用 PHP 并运行以下命令:
testKey='8798(*&98}9%"^8&]8_98{9798**76876'
testHex=$(php -r "echo bin2hex('$testKey');")
echo $testHex
这将导致
38373938282a2639387d3925225e38265d385f39387b393739382a2a3736383736
我有一个 PHP 不可用的系统,有没有办法仅使用 bash 获得相同的结果?
谢谢
答案1
如果你躺着hexdump
:
$ printf "%s" "$testKey" | hexdump -ve '/1 "%x"'
38373938282a2639387d3925225e38265d385f39387b393739382a2a3736383736
-e
设置格式字符串hexdump
,它“必须用双引号 (" ) 标记括起来”。/1
格式字符串 一次使用一个字节%x
,以十六进制打印它(否则字节顺序可能会导致不同的输出)。-v
是让它也打印重复的数据(默认是将它们替换为*
)。
答案2
是的,xxd
你可以做同样的事情:
testKey='8798(*&98}9%"^8&]8_98{9798**76876'
testHex=$(echo -n "${testKey}" | xxd -p -c 100)
-p 标志用于没有偏移信息的十六进制转储。
-c 100 标志适用于 100 个字符的行长度(默认为 16,最大 256)。
答案3
通过“just bash”,使用以下技巧BASH 打印问题 (printf \$(printf '%03o' $1))
$ for ((i=0;i<${#testKey};i++)); do printf '%x' "$(printf "'%c" "${testKey:i:1}")"; done; echo
38373938282a2639387d3925225e38265d385f39387b393739382a2a3736383736
用perl的unpack
$ perl -E 'say unpack "H*", $ARGV[0]' "$testKey"
38373938282a2639387d3925225e38265d385f39387b393739382a2a3736383736