cpioでエンディアン変換


アニメ『トリニティセブン』(2014)

DxDが面白かったので、同じくハーレムものの本アニメが見たくなりました。やはり主人公は強い。
アーカイブ(書庫)に接続して、魔法を使うのですが、だんだん中二病になってきた自分は、このアーカイブに接続って表現がかっこよくて仕方がないです。
コンピュータ使ってると、アーカイブは接続するものではなくて、展開するものなんですが、そもそも本来のアーカイブは、重要記録を保存する場所のことを言うようです。
なので、このアニメの使い方の方が合ってるのかもしれません。

アーカイブつながりで、cpio使います。
書庫にする元データはこれ。

takk@deb9:~/tmp$ seq 12 | perl -ne 'print chr'>a.bin
takk@deb9:~/tmp$ hd a.bin
00000000  01 02 03 04 05 06 07 08  09 0a 0b 0c              |............|
0000000c
takk@deb9:~/tmp$ 

cpioで書庫を作成するには、ファイルの一覧をcpioの標準入力に与えます。find等で一覧は作りますが、今はファイル一つなのでecho a.binで与えます。
-oオプションはコピーアウトモードで、書庫を作成するときのモードです。リダイレクトして書庫ファイルへ書き出します。

takk@deb9:~/tmp$ echo a.bin | cpio -o > a.bin.cpio
1 block
takk@deb9:~/tmp$ ls
a.bin  a.bin.cpio
takk@deb9:~/tmp$ hd a.bin.cpio
00000000  c7 71 01 08 56 58 a4 81  e8 03 e8 03 01 00 00 00  |.q..VX..........|
00000010  ee 5a ee bd 06 00 00 00  0c 00 61 2e 62 69 6e 00  |.Z........a.bin.|
00000020  01 02 03 04 05 06 07 08  09 0a 0b 0c c7 71 00 00  |.............q..|
00000030  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00000040  0b 00 00 00 00 00 54 52  41 49 4c 45 52 21 21 21  |......TRAILER!!!|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
takk@deb9:~/tmp$ wc -c a.bin.cpio
512 a.bin.cpio
takk@deb9:~/tmp$ 

書庫を展開するには、-iオプションでコピーインモードを使います。

takk@deb9:~/tmp$ rm a.bin
takk@deb9:~/tmp$ ls
a.bin.cpio
takk@deb9:~/tmp$ cat a.bin.cpio | cpio -i
1 block
takk@deb9:~/tmp$ ls
a.bin  a.bin.cpio
takk@deb9:~/tmp$ 

展開後のデータは、元ファイルと一致しますね。

takk@deb9:~/tmp$ hd a.bin
00000000  01 02 03 04 05 06 07 08  09 0a 0b 0c              |............|
0000000c
takk@deb9:~/tmp$ 

さて、タイトルにあるエンディアン変換ですが、-iオプション時のコピーインモードのときのみ使用できます。
-sを合わせて指定することで、上下1Byte(8bit)の交換をしてくれます。

takk@deb9:~/tmp$ rm a.bin
takk@deb9:~/tmp$ ls
a.bin.cpio
takk@deb9:~/tmp$ cat a.bin.cpio | cpio -is
1 block
takk@deb9:~/tmp$ ls
a.bin  a.bin.cpio
takk@deb9:~/tmp$ hd a.bin
00000000  02 01 04 03 06 05 08 07  0a 09 0c 0b              |............|
0000000c
takk@deb9:~/tmp$ 

さらに、-Sを指定すると上下16bitの交換をしてくれます。

takk@deb9:~/tmp$ rm a.bin
takk@deb9:~/tmp$ ls
a.bin.cpio
takk@deb9:~/tmp$ cat a.bin.cpio | cpio -iS
1 block
takk@deb9:~/tmp$ ls
a.bin  a.bin.cpio
takk@deb9:~/tmp$ hd a.bin
00000000  03 04 01 02 07 08 05 06  0b 0c 09 0a              |............|
0000000c
takk@deb9:~/tmp$ 

4Byteのエンディアン変換したいときは、-sと-Sを同時に指定します。

takk@deb9:~/tmp$ cat a.bin.cpio | cpio -isS
1 block
takk@deb9:~/tmp$ ls
a.bin  a.bin.cpio
takk@deb9:~/tmp$ hd a.bin
00000000  04 03 02 01 08 07 06 05  0c 0b 0a 09              |............|
0000000c
takk@deb9:~/tmp$ 

-sと-Sの同時指定は、-bと同じです。

takk@deb9:~/tmp$ rm a.bin
takk@deb9:~/tmp$ cat a.bin.cpio | cpio -ib
1 block
takk@deb9:~/tmp$ hd a.bin
00000000  04 03 02 01 08 07 06 05  0c 0b 0a 09              |............|
0000000c
takk@deb9:~/tmp$ 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA