假设我有一个格式为
的二进制文件 [unsigned int(length of text)][text][unsigned int(length of text)][text][unsigned int(length of text)][text]
该文件的模式不断重复。如何读取unsigned int并将其打印出来,后跟Perl中的文本块?
同样,这是一个二进制文件而不是纯文本文件。
答案 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)
答案 3 :(得分:0)
这里没有足够的信息来完全解决这个问题。
需要的是长度字段和文本字段的确切格式。 int 2字节,4字节还是8字节? (一切皆有可能。)还是小端还是大端?
根据这些信息,然后使用read函数访问第一个整数,并使用位操作或解包函数将其转换为数字。
下一个问题是文本字符串的确切格式。是ASCII,EBCDIC还是UTF格式?知道了这一点,您就可以计算字符串的长度,并使用一个或多个读取操作来获取原始字符串,您可能需要将其转换为更易于管理的形式。
另一件事 - 你需要以二进制模式打开文件,否则你可能无法获得预期的结果。