60183


ちょっとしたバイナリファイルが必要なときは`echo -n -e`で作っていますが、もっと楽にできる方法をご存じないでしょうか。

既に存在するバイナリファイルの変更は、odの結果をgawkで`echo`形式に加工してbashに渡していますが、新規に作るときが悩ましいです。余裕があればプログラムを書いて作っていますが、もっと手軽にできる方法を探しています。

**バイナリファイルを作る元の表現形式**

  * 内容はランダムでよい
  * 値は指定したい(16進数だけでも可、できれば文字列、10進数、16進数の混在が指定できるとなお良い)

**実行環境**

WSLを含むUnix系の環境


CC BY-SA 4.0
2019-10-29T06:47:12.057
60066
2019-11-06T17:36:38.057
2019-11-06T17:36:38.057
3060
35558
question
bash shellscript sh
shスクリプトからバイナリファイルを作るにはどうすればよいか


コメント欄で解決しているようですので、回答として転載しておきますね。

> 2桁の16進数の並びであれば `echo 011affb0ab | grep -Eo '..' | xargs -n1 -I@ printf
> '\x@'` でしょうか。 –
> [metropolis](https://ja.stackoverflow.com/users/16894/metropolis)

**追加: sed 版**

[code]

    $ printf $(echo 011affb0ab | sed -E 's/(..)/\\x\1/g') | od -tx1a
    0000000  01  1a  ff  b0  ab
            soh sub del   0   +
    
[/code]


CC BY-SA 4.0
2019-10-30T13:31:01.987
60135
2019-10-30T13:43:45.770
2019-10-30T13:43:45.770
17181
60066
answer


シェルスクリプト内でperlを使うことに抵抗がないなら、packを使うと第1引数のテンプレート文字列で変換方法を指定しつつ柔軟にバイナリ化させることが出来ます。

[code]

    $ perl -e 'print pack( "NVnvCa15", 0x12345678, 0x12345678, 0xabcd, 0xabcd, 9, "test string" )' | hexdump -C
    00000000  12 34 56 78 78 56 34 12  ab cd cd ab 09 74 65 73  |.4VxxV4......tes|
    00000010  74 20 73 74 72 69 6e 67  00 00 00 00              |t string....|
    0000001c
    
[/code]


CC BY-SA 4.0
2019-11-01T10:39:09.310
60183
2019-11-01T10:39:09.310
30745
60066
answer


自己回答です。hidezzzさんの回答の方法を参考にしてでバイナリファイルを作ることにしました。どうもありがとうございました。

perlの演算が使えるので結構自由度が大きいです。

perlのpackに詳しくないので、perlの良さがアピールできていませんが、実行例も書いておきました。

【コード】  
qqq.sh

[code]

    #!/bin/bash
    while read x y
    do
            printf "%s\n" 'print pack( "'${x}'", '${y}' );'
    done | perl
    
[/code]

【実行例】

[code]

    ./qqq.sh  | od -Ax -x --endian=big
    l 0x1234
    A3 ABC
    l (8*9)
    
[/code]

【実行結果】

[code]

    000000 3412 0000 4142 4348 0000 0000
    00000b
    
[/code]


CC BY-SA 4.0
2019-11-06T03:52:27.193
60288
2019-11-06T13:15:30.433
2019-11-06T13:15:30.433
35558
35558
60066
answer