web-dev-qa-db-ja.com

シェルスクリプトでバイナリデータを16進数に変換しますか?

これを尋ねるのは少しばかげていると感じますが(基本的に聞こえます)、他の場所で答えを見つけることができません。バイナリデータを16進数に変換したいだけです。 hexdumpは賢すぎるように思えますが、私にとっては「オーバーフォーマット」しています。/dev/randomからxバイトを取得し、16進数として渡したいです。

できれば、すべてのマシンにインストールする必要がないように、標準のLinuxツールのみを使用したいと思います(多数あります)

47
davka

おそらくxxdを使用します:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
64
unutbu

気を付けて!

hexdumpxxdは異なるエンディアンネスで結果を与えます!

$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi :D

29
Zibri

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システムの逆。」

21

おそらく、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プログラムをシェルスクリプトに埋め込むこともできます。

10

すべての解決策は覚えにくいか複雑すぎるように思えます。printfを使用して最短を見つけました:

$ printf '%x\n' 256
100

[編集]

しかし、コメントで指摘されているように、これは著者が望んでいるものではないので、以下で公平であることが完全な答えです。

...上記を使用して実際のバイナリデータストリームを出力するには:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)

それがすること:

  • printf '%x\n' ....-整数のシーケンスを出力します。 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
6
marcinj

dd + hexdumpも機能します。

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'
3
user405725

大きなストリーム(改行なし)が必要な場合は、バイト単位の変換にtrxxd(vimの一部)を使用できます。

head -c1024 /dev/urandom | xxd -p | tr -d $'\n'

または、単語単位の変換にhexdump(posix)を使用できます。

head -c1024 /dev/urandom | hexdump '-e"%x"'

違いはエンディアンです。

3
Kevin Cox

この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
1
user2350426