从perl中的二进制文件中获取十进制值



我有一个包含我的数据的二进制文件。数据以42字节的块为单位。我正在尝试逐块获取这些数据,并在csv文件中以行形式打印等效的十进制值。目前,我正试图首先在屏幕上获取十进制数据。用txt编辑器打开的文件看起来显示了这样的东西:

+ Ö K¹Lÿ    ÿ    ÿ    ÿ    | D Ö ä
+ Ö K¹*ÿ    ÿ    ÿ    ÿ    | D Ö ä
+ Ö K¸4ÿ    ÿ    ÿ    ÿ    | D Ö ä
+ Ö Kµ*ÿ    ÿ    ÿ    ÿ    | D Ö ä
# 9 Ö K©[ÿ    ÿ    ÿ    ÿ    | D Ö ä
" 9 Ö K©‰ÿ    ÿ    ÿ    ÿ    | D Ö ä
+ 0 Ö K¯¿ÿ    ÿ    ÿ    ÿ    | D Ö ä
9 Ö Kªµÿ    ÿ    ÿ    ÿ    | D Ö ä
3 Ö K¨–ÿ    ÿ    ÿ    ÿ    | D Ö ä
3 Ö Kªxÿ    ÿ    ÿ    ÿ    | D Ö ä
Z Ö K¶:ÿ    ÿ    ÿ    ÿ    | D Ö ä
...

如果我用十六进制编辑器打开它,那么我会得到这个:

00 44 00 D6 00 E4 07 04 07 13 35 13 00 00 30 00 D6 00 4B C9 0D FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 7C 00 44 00 D6 00 E4 07 04 07 13 35 39 00 00 30 00 D6 00 4B C5 10 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 7C 00 44 00 D6 00 E4 07 04 07 13 36 16 00 00 33 00 D6 00 4B CE 44 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 7C 00 44 00 D6 00 E4 07 04 07 13 36 2F 00 00 30 00 D6 00 4B CE 12 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 7C 00 44 00 D6 00 E4 07 04 07 13 37 0C 00 00 33 00 D6 00 4B CE 21 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 7C 00 44 00 D6 00 E4 07 04 07 13 38 04 00 00 30 00 D6 00 4B D7 0A FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00 FF 00 00 00 00...

我的想法是一次读取一个字节的输入文件,并将其存储在大小为42的数组中,然后转换42个字节并打印它们,然后继续到下一个42个字节。这就是我目前所拥有的。我正在使用perl-btw。使用

use strict;
use warnings;
use diagnostics;
use feature 'say';
use feature "switch";
use v5.16;
my $input_file = 'pathtofileZONE0.txt'; 
open my $fh, '<', $input_file or die;
binmode $input_file;
my @decimal_values=[42];
my @buffer=[42];
while ( <$fh>) {
my $i;
for (my $i=0; $i<42; $i++) {
read($fh, @buffer[$i], 1);
my @decimal_values = map (eval("0b$_"), @buffer);
}
say @decimal_values;
}


当我执行代码时,我只得到以下消息:

Bareword found where operator expected at (eval 18248) line 1, near "0bb" (#3)

我不知道我做错了什么!

以下是如何用Perl读取二进制文件的一个示例:

use feature qw(say);
use strict;
use warnings;
use constant BUFSIZE => 42;
my $input_file = 'ZONE0.dat';
open (my $BIN, "<:raw", $input_file) or die "can't open the file $input_file: $!";
my $buffer;
while (1) {
my $bytes_read = sysread $BIN, $buffer, BUFSIZE;
die "Could not read file $input_file: $!" if !defined $bytes_read;
last if $bytes_read <= 0;
my @decimal = map { unpack "C", $_ } split //, $buffer;
say join ", ", @decimal;
}
close $BIN;

最新更新