in reply to Extracting Image/File Metadata

You can use sysread to read the header out of the file. Then, use something like Data::FixedFormat or Parse::FixedLength to decode the information. These modules use pack and unpack to manipulate buffers of (possibly binary) data.

--- print map { my ($m)=1<<hex($_)&11?' ':''; $m.=substr('AHJPacehklnorstu',hex($_),1) } split //,'2fde0abe76c36c914586c';

Replies are listed 'Best First'.
Re: Re: Extracting Image/File Metadata
by JunkGuy (Initiate) on Feb 05, 2003 at 23:47 UTC
    I think sysread will work for me, except for one thing: I need to be able to pull out and retain some data in binary format. I know that pack adn unpack is used for that, as you stated, but I can't seem to get it to work. Is there any special trick to using sysread with pack and unpack? Thanks for your time and your reply.

      I use the code below to get some informatiion out of WAV files. Maybe it will help you read your files.

      #!/usr/bin/perl -w use strict; use Fcntl; my $fnm = shift; sysopen WAV,$fnm,O_RDONLY; my $riff; sysread WAV,$riff,12; my $fmt; sysread WAV,$fmt,24; my $data; sysread WAV,$data,8; close WAV; # RIFF header: 'RIFF', long length, type='WAVE' my ($r1,$r2,$r3) = unpack "A4VA4", $riff; # WAV header, 'fmt ', long length, short unused, short channels, # long samples/second, long bytes per second, short bytes per sample, # short bits per sample my ($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8) = unpack "A4VvvVVvv",$fmt; # DATA header, 'DATA', long length my ($d1,$d2) = unpack "A4V", $data; print << "EOF"; RIFF header: $r1, length $r2, type $r3 Format: $f1, length $f2, always $f3, channels $f4, sample rate $f5, bytes per second $f6, bytes per sample $f7, bits per sample $f8 Data: $d1, length $d2 EOF
      --- print map { my ($m)=1<<hex($_)&11?' ':''; $m.=substr('AHJPacehklnorstu',hex($_),1) } split //,'2fde0abe76c36c914586c';