如何从Perl中的二进制文件中读取unsigned int?

时间:2009-09-02 20:11:10

标签: perl binary io

假设我有一个格式为

的二进制文件
    [unsigned int(length of text)][text][unsigned int(length of text)][text][unsigned int(length of text)][text]

该文件的模式不断重复。如何读取unsigned int并将其打印出来,后跟Perl中的文本块?

同样,这是一个二进制文件而不是纯文本文件。

4 个答案:

答案 0 :(得分:2)

这是一个小工作示例。

#!/usr/bin/perl

use strict;
use warnings;

my $INT_SIZE = 2;
my $filename = 'somefile.bin';

open my $fh, '<', $filename or die "Couldn't open file $filename: $!\n";

binmode $fh;

while ( read $fh, my $packed_length, $INT_SIZE ) {

    my $text = '';
    my $length = unpack 'v', $packed_length;

    read $fh, $text, $length;

    print $length, "\t", $text, "\n";
}

更改INT_SIZE以及解包模板的大小和字节顺序(“v”或“n”或“V”或“N”)。有关详细信息,请参阅unpack联机帮助页。

答案 1 :(得分:1)

您需要在数据上使用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;

答案 2 :(得分:0)

除了使用unpack之外,正如RC指出的那样,您几乎肯定希望使用readsysread来读取文件中的数据。

答案 3 :(得分:0)

这里没有足够的信息来完全解决这个问题。

需要的是长度字段和文本字段的确切格式。 int 2字节,4字节还是8字节? (一切皆有可能。)还是小端还是大端?

根据这些信息,然后使用read函数访问第一个整数,并使用位操作或解包函数将其转换为数字。

下一个问题是文本字符串的确切格式。是ASCII,EBCDIC还是UTF格式?知道了这一点,您就可以计算字符串的长度,并使用一个或多个读取操作来获取原始字符串,您可能需要将其转换为更易于管理的形式。

另一件事 - 你需要以二进制模式打开文件,否则你可能无法获得预期的结果。