python unpack 到数列_如何从二进制文件中读取块并使用Python或Perl使用unpack提取结构?...

您正在阅读的数据的Endianness在此处很重要。你似乎正在解压缩8个八位字节,因为两个长点以小端顺序存储。您确定它不是一个64位数量(这会使q或Q格式更合适)吗?不幸的是,我在32位机器上,所以我的perl不支持Q。

但是,以下内容应指向正确的方向:

#!/usr/bin/env perl

use strict; use warnings;

use autodie;

use Fcntl qw(:seek);

use List::Util qw( sum );

my ($input_file) = @ARGV;

die "Need input file\n" unless defined $input_file;

my $HEADER_SIZE = 4_096;

my @typedef = (

{

fields => [

qw(

TS_INCR_LO

TS_INCR_HI

SEQID

OP

LUN

NBLKS

LBA_LO

LBA_HI

)

],

tmpl => 'LLLSSLLL',

start => 0,

size => 28,

},

{

fields => [

qw(

TS_INCR_LO

TS_INCR_HI

SEQID

OP

LUN

LATENCY_TICKS

HOST_ID

HOST_LUN

)

],

tmpl => 'LLLSSLSS',

start => 28,

size => 24,

},

);

open my $input, '<:raw>

seek $input, $HEADER_SIZE, SEEK_SET;

my $BLOCK_SIZE = sum map $_->{size}, @typedef;

read $input, my($buffer), $BLOCK_SIZE;

my @structs;

for my $t ( @typedef ) {

my %struct;

@struct{ @{ $t->{fields}} } = unpack(

$t->{tmpl},

substr($buffer, $t->{start}, $t->{size})

);

push @structs, \%struct;

}

use Data::Dumper;

print Dumper \@structs;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值