これを尋ねるのは少しばかげていると感じますが(基本的に聞こえます)、他の場所で答えを見つけることができません。バイナリデータを16進数に変換したいだけです。 hexdump
は賢すぎるように思えますが、私にとっては「オーバーフォーマット」しています。/dev/randomからxバイトを取得し、16進数として渡したいです。
できれば、すべてのマシンにインストールする必要がないように、標準のLinuxツールのみを使用したいと思います(多数あります)
おそらくxxd
を使用します:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
気を付けて!
hexdump
とxxd
は異なるエンディアンネスで結果を与えます!
$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412
http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi :D
od(GNUシステム)の場合:
$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a
Hexdumpを使用する(BSDシステム):
$ echo abc | hexdump -ve '/1 "%02x"'
6162630a
から http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump :
"システムのタイプに応じて、これら2つのユーティリティのいずれかまたは両方が利用可能になります。BSDシステムは、od hexdumpの場合、GNUシステムの逆。」
おそらく、Cで独自の小さなツールを作成し、その場でコンパイルできます。
int main (void) {
unsigned char data[1024];
size_t numread, i;
while ((numread = read(0, data, 1024)) > 0) {
for (i = 0; i < numread; i++) {
printf("%02x ", data[i]);
}
}
return 0;
}
次に、標準入力からフィードします。
cat /bin/ls | ./a.out
Heredoc構文を使用して、この小さなCプログラムをシェルスクリプトに埋め込むこともできます。
すべての解決策は覚えにくいか複雑すぎるように思えます。printf
を使用して最短を見つけました:
$ printf '%x\n' 256
100
[編集]
しかし、コメントで指摘されているように、これは著者が望んでいるものではないので、以下で公平であることが完全な答えです。
...上記を使用して実際のバイナリデータストリームを出力するには:
printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)
それがすること:
printf '%x,' 1 2 3
、印刷1,2,3,
cat /dev/urandom
-ランダムなバイナリデータを出力しますhead -c 5
-バイナリデータを5バイトに制限od -An -vtu1
-8進ダンプコマンド、バイナリを10進数に変換テストケースとして( 'a'は61 hex、 'p'は70 hex、...):
$ printf '%x\n' $(echo "Apple" | head -c 5 | od -An -vtu1)
61
70
70
6c
65
または、個々のバイナリバイトをテストするには、入力時に10進数で61( '=' char)を与えてバイナリデータ('\\x%x'
formatはそれを行います)、上記のコマンドは正しく3d(10進数61)を出力します:
$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
dd + hexdumpも機能します。
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
大きなストリーム(改行なし)が必要な場合は、バイト単位の変換にtr
とxxd
(vimの一部)を使用できます。
head -c1024 /dev/urandom | xxd -p | tr -d $'\n'
または、単語単位の変換にhexdump
(posix)を使用できます。
head -c1024 /dev/urandom | hexdump '-e"%x"'
違いはエンディアンです。
この3つのコマンドは同じものを出力します(0102030405060708090a0b0c):
n=12
echo "$a" | xxd -l "$n" -p
echo "$a" | od -N "$n" -An -tx1 | tr -d " \n" ; echo
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo
n=12
および$a
が1〜26のバイト値であると仮定します。
a="$(printf '%b' "$(printf '\\0%o' {1..26})")"
それを使用して、各プログラムで$n
ランダムバイト値を取得できます。
xxd -l "$n" -p /dev/urandom
od -vN "$n" -An -tx1 /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e '/1 "%02x"' /dev/urandom ; echo