PHP bin2hex関数と一致するようにBASHバイナリを16進数に変換しますか?

PHP bin2hex関数と一致するようにBASHバイナリを16進数に変換しますか?

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

-ehexdump「二重引用符(」)で囲む必要があるフォーマット文字列を設定します。/1フォーマット文字列は一度に1バイトを使用して%x16進数で印刷されます(そうでないと、バイト順序によって異なる出力が発生する可能性があります)-v。デフォルトは)に置き換えることです*

答え2

はい、xxd同じことができます。

testKey='8798(*&98}9%"^8&]8_98{9798**76876'
testHex=$(echo -n "${testKey}" | xxd -p -c 100)

-pフラグは、オフセット情報のない16進ダンプに使用されます。
-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

パールを使ってunpack

$ perl -E 'say unpack "H*", $ARGV[0]' "$testKey"
38373938282a2639387d3925225e38265d385f39387b393739382a2a3736383736

関連情報