揮発性のメモ2

http://d.hatena.ne.jp/iww/

ファイルをバイナリとして読み込む

バイナリファイルを読む練習。
ファイルの先頭部分を読み込んで、GZIPのヘッダ(0x1F,0x8B,0x08,0x00)を探し、その先頭位置を出力するプログラム。

#!/usr/bin/perl

use strict; use warnings;
my $size=32768;

open( my $fh, $ARGV[0] ) or die("open");
binmode($fh);
read( $fh, my $buf, $size ) or die("read");
my @d = unpack( "C*", $buf );

for( my $i=0; $i<$size-4; $i++ ){
    if( $d[$i]==0x1f && $d[$i+1]==0x8b && $d[$i+2]==0x08 && $d[$i+3]==0x00 ){
        print "$i\n";
        exit 0;
    }
}
exit 1;
$ ./sentou.pl /boot/vmlinuz-2.6.32-5-amd64 
14953

binmode はあってもなくてもちゃんと動く。 readして即unpackするようなときはバイナリモードとか関係ないってことか?




vmlinuz を解凍するための 1f 8b 08 00 | Apribase
これをやるために作った

$ K=/boot/vmlinuz-2.6.32-5-amd64
$ A=`./sentou.pl $K`
$ dd if=$K bs=1 skip=$A 2>/dev/null | zcat -q | strings | grep "Linux version"

Linux version 2.6.32-5-amd64 (Debian 2.6.32-35) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Tue Jun 14 09:42:28 UTC 2011