Perl:一次读取一个字节的二进制文件

标签 perl file input binary byte

我正在编写一个工具,它需要一次读取一个二进制文件,处理每个字节,并可能根据处理的值采取一些行动。但出于某种原因,Perl 获得的值与文件中的数据不同。我正在使用与此类似的代码(为简洁起见,但仍然存在问题):

#!/usr/bin/perl
use strict;

my $bytesToProcess = 16;
my $fileName = 'datafile.bin';

print "Processing $bytesToProcess bytes...\n";

open FILE, "<:raw", $fileName or die "Couldn't open $fileName!";

for my $offset (0 .. $bytesToProcess - 1)
{
    my $oneByte;
    read(FILE, $oneByte, 1) or die "Error reading $fileName!";
    printf "0x%04X\t0x%02X\n", $offset, $oneByte;
}

close FILE;

输入值(数据文件的前 16 个字节):50 53 4D 46 30 30 31 35 00 00 70 00 07 3F 10 00
输出:
Processing 16 bytes...
0x0000  0x00
0x0001  0x00
0x0002  0x00
0x0003  0x00
0x0004  0x00
0x0005  0x00
0x0006  0x01
0x0007  0x05
0x0008  0x00
0x0009  0x00
0x000A  0x00
0x000B  0x00
0x000C  0x00
0x000D  0x00
0x000E  0x00
0x000F  0x00

知道这里出了什么问题吗?

最佳答案

read返回字节作为字符 "\x50" ,不是数字 0x50 .更改 printf线到

printf "0x%04X\t0x%02X\n", $offset, ord $oneByte;

另一种选择是使用 unpack 'c', $oneByte .

关于Perl:一次读取一个字节的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191462/

相关文章:

c - scanf动态分配

perl - 为什么版本排序顺序颠倒了?

perl - 如何检测XML元素是否有子元素

c# - C#中的文件比较

python - 如何使用 Python 传输二进制数据?

c - fscanf 如何处理不同的变量类型?

mysql - 像 £(英镑)这样的拉丁字符编码在使用 perl 脚本编码后会抛出垃圾值

perl - 如何在 perl 中使用对象对哈希进行排序

javascript - 如果浏览器不支持多个,如何使用 javascript 验证 &lt;input type=file multiple>

python - 在 python3 中检测到输入之前如何执行某些操作?