我有一个二进制文件,我需要能够解析。我要做的是指定一个偏移量,然后让程序返回该位置的字节值。
我不确定的是如何解决这个问题。我有文件打开部分,但我不知道如何让程序跳转到该位置。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:5)
use Fcntl qw(:seek);
my($fh, $filename, $byte_position, $byte_value);
$filename = "/some/file/name/goes/here";
$byte_position = 42;
open($fh, "<", $filename)
|| die "can't open $filename: $!";
binmode($fh)
|| die "can't binmode $filename";
sysseek($fh, $byte_position, SEEK_CUR) # NB: 0-based
|| die "couldn't see to byte $byte_position in $filename: $!";
sysread($fh, $byte_value, 1) == 1
|| die "couldn't read byte from $filename: $!";
printf "read byte with ordinal value %#02x at position %d\n",
ord($byte_value), $byte_position;
答案 1 :(得分:1)
#! /usr/bin/env perl
use bytes;
use strict;
use warnings;
use Fcntl ':seek';
open my $fh, "<", $0 or die "$0: open: $!";
seek $fh, 0, SEEK_END or die "$0: seek: $!";
my $last = tell $fh;
die "$0: tell: $!" if $last < 0;
for (1 .. 20) {
my $offset = int rand($last + 1);
seek $fh, $offset, SEEK_SET or die "$0: seek: $!";
defined read $fh, my $byte, 1 or die "$0: read: $!";
$byte = "\\$byte" if $byte eq "'" || $byte eq "\\";
printf "offset %*d: \\x%02x%s\n",
length $last, $offset,
unpack("C", $byte),
$byte =~ /[[:print:]]/a ? " '$byte'" : "";
}
__DATA__
: ℞:
¡ƨdləɥ ƨᴉɥʇ ədoɥ puɐ ʻλɐp əɔᴉu ɐ əʌɐɥ ʻʞɔnl poo⅁
示例输出:
offset 47: \x65 'e' offset 392: \x20 ' ' offset 704: \xf0 offset 427: \x5c '\'' offset 524: \x61 'a' offset 1088: \x75 'u' offset 413: \x20 ' ' offset 1093: \xbb offset 1112: \xc9 offset 377: \x24 '$' offset 64: \x46 'F' offset 361: \x62 'b' offset 898: \xf0 offset 566: \x5d ']' offset 843: \xf0 offset 1075: \xc9 offset 280: \x20 ' ' offset 3: \x2f '/' offset 673: \x8a offset 153: \x20 ' '
__DATA__
部分的内容是从Tom’s excellent suggestions借来的,用于处理Perl程序中的UTF-8。