繁体   English   中英

如何从 Perl 中的二进制文件中读取无符号整数?

[英]How can I read an unsigned int from a binary file in Perl?

假设我有一个二进制文件,其格式如下

    [unsigned int(length of text)][text][unsigned int(length of text)][text][unsigned int(length of text)][text]

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

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

这是一个小的工作示例。

#!/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”)。 有关详细信息,请参阅解包手册页。

您需要对数据使用解包功能。 查看打包/解包教程(又名系统如何存储数据)

这应该让您朝着正确的方向前进(假设是 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;

除了使用unpack ,正如RC 指出的那样,您几乎肯定会想要使用readsysread从文件中读取数据。

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

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

有了这些信息,您就可以使用 read 函数访问第一个整数,并使用位操作或 unpack 函数将其转换为数字。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM