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

getting decimal values from a binary file in 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 顺便说一句。 使用

use strict;
use warnings;
use diagnostics;
use feature 'say';
use feature "switch";
use v5.16;

my $input_file = 'pathtofile\ZONE0.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;