On the basis of the code you have posted, you are making really hard work of parsing those files.
Commensurate with refining the templates for records 1 & 2 which you haven't fully described, something like this would read the entire thing:
#! perl -slw use strict; use constant { RECORD_1 => 'f512 l512', RECORD_2 => 'f3 l3', RECORD_3 => 'ff ll s2', ## index of field in rec2 that contains count of type 3 records that f +ollow it COUNT => 3, }; open I, '<:raw', $ARGV[0] or die "$ARGV[0] { $!"; my @rec1 = unpack RECORD_1, do{ local $/ = \4096; <I> }; until( eof( I ) ) { my @rec2 = unpack RECORD_2, do{ local $/ = \36; <I> }; for ( 1 .. $rec2[ COUNT ] ) { my @rec3 = unpack RECORD_3, do{ local $/ = \28; <I> }; } } close I;
Note also, that on recent versions of Perl (since 5.10), unpack can deal with little/big-endian issues for you.
Say your type 2 records contain 2 big-endian floats; followed by 2 little-endian int32s and then 2 big-endian int32s:
Use a template of:'f>2 l<2 l>2'
In reply to Re: Missing byte using unpack, pack, read(in terms of bytes)
by BrowserUk
in thread Missing byte using unpack, pack, read(in terms of bytes)
by joemaniaci
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |