データにunpack関数を使用する必要があります。チェックアウト:Pack/Unpack Tutorial (aka How the System Stores Data)
このあなたは(32ビットと仮定して)正しい方向に向かって取得する必要があります。
#!/usr/bin/perl
use strict;
my $strBuf = "perl rocks";
my $packed = pack("I Z15", length($strBuf), $strBuf);
{
open(my $binFile, '>', "test.bin") || die("Error opening file\n");
binmode $binFile;
print $binFile $packed;
close $binFile;
}
open(my $binFile, '<', "test.bin") || die("Error opening file\n");
binmode $binFile;
my $buffer;
read($binFile, $buffer, 4); ## Read out unsigned int binary data
my $length = unpack("I", $buffer); ## Unpack the data
read($binFile, $buffer, $length); ## Read the length out as binary
my $string = unpack("Z$length", $buffer); ## Unpack the string data in buffer
print "Len: $length String: $string\n";
exit;
あなたのコードでは、Cの 'unsigned int'は4バイトであると仮定しています(これは私が知っているように)。このミックスアップを回避するより良い方法は、ファイル全体を読み込み、それを処理することです。つまり、 'unsigned int 'が2バイトの16ビットプラットフォーム上で動作する場合、コードは正常に動作します。 –
だからこそ私は32ビットと仮定していた。私はメモリに読み込むことは良いと思いますが、おそらく良い解決策であることに同意しますが、処理されているファイルのサイズやマシン上で使用可能なメモリはわかりません。両方の解決策にはピット・フォールがあります。 –
Chrisさん、ファイル全体をメモリに読み込むのは、間違った整数サイズを使用しないでください。 –