Hi everyone,

I have a question about using pack/unpack.  I am packing a structure using the 
following code (It will be at the end of the mail).  I am basically packing the 
following template:  "A2A50la*"

within the a* is all the data that I read from $file1, after reading this data I want 
to pack a 2 byte trailer.  I can pack it with no problem, but when I try to unpack the 
data I tried unpacking using to unpack statements and it failed.  I want to do 
something like this.

($header, $path, $length, $rest) = unpack "A2A50la*", $packedStuff;
($data,$trailer) = unpack "a$lengthA2", $rest;

You see I need $length to know how much data there is, I already know the trailer is 
2bytes.  When I try this unpacking twice, I don't get anything, but when I print out 
$rest, I see that its still binary format so it should be unpackable.   If I don't add 
a 2 byte trailer then everything is fine, but I would like to figure out how to add a 
trailer, and then unpack the binary packet like above.

Any ideas are greatly appreciated.  Below is the code I have now, it doesn't have the 
lines where I am unpacking twice.  I took them out.  Right now I am not putting a 
2byte trailer in the packet.

Thanks in advance.

#!/usr/local/bin/perl

$file1 = "/opt/odigo/bin/classes/groups_4.1.0.0r.jar";
$file2 = "/tmp/grouptest.jar";
open(FROM,"$file1");
$blksize = (stat FROM)[11] || 84000;

$packedPath .= pack "A2A50", "HB", $file2;
#print "PACKED: $packedPath\n";

while ($len = sysread FROM, $buf, $blksize) {
  if (!defined $len) {
    next if $! == EINTR;
    die "System read error: $!\n";
  }
  print "LEN: $len\n";
  $real_length += $len;
  $lbuf += length $buf;
  $rbuf .= $buf;
}
print "RLEN: $real_length\n";
print "RBLEN: $lbuf\n";
$packedPath .= pack "l", $real_length;
$packedPath .= pack "a*", $rbuf;
#$packedPath .= pack "A2", "HF";

($header,$path,$llength,$data) = unpack "A2A50la*", $packedPath;
print "HEADER: $header\n";
print "PATH: $path\n";
print "LENGTH: $llength\n";
#print "TRAIL: $trailer\n";
exit 0;

open(TO,">$file2");
$offset = 0;
$ld = length $data;
print "LD: $ld\n";
while ($length) {
  print "L: $length\n";
  $written = syswrite TO, $data, $length, $offset;
  print "W: $written\n";
  print "O: $offset\n";
  die "System write error: $!\n" unless defined $written;
  $offset += $written;
  print "O: $offset\n";
  $length -= $written;
}

Reply via email to