繁体   English   中英

如何在Perl中将十六进制值字符串输出到二进制文件中?

[英]How do I output a string of hex values into a binary file in Perl?

我正在尝试读取二进制文件,将数据存储为十六进制值的字符串,使用正则表达式修改一些十六进制值,并将数据吐出到一个新的二进制文件(这是原始的略微修改版本) )。

除了最后一步,我可以做所有这些步骤。 当我在十六进制编辑器中打开新的二进制文件时,这一切似乎都是错误的...我希望它正是我的十六进制字符串的方式,但是在十六进制编辑器中。

以下是我在创建新文件时尝试执行的操作:

# Format data string into an array for file processing
@data_ary = unpack('H*', $data_str);

generate_new_file($filname, \@data_ary);


sub generate_new_file
{
     my $fname = "mod -" . shift(@_);
     my $aref = shift(@_);

     open(BIN, ">", $fname) or die;
     binmode(BIN);

     for my $nybble(@$aref)
     {
         print (BIN $nybble)
     }
     close(BIN);
}

我猜我的问题与我使用unpack有关 但我真的不确定如何将一个巨大的十六进制字符串放入一个实际上被读为十六进制而不是ASCII字符的形式。 任何建议都非常感谢!

上面显示的代码仅用于尝试将数据输出到新文件中。 我已经拥有了我想要在$ data_str中输出的所有十六进制。 因此,unpack是尝试将十六进制字符串转换为十六进制值列表。

我越走越近了。 我从头开始删除了unpack,因为我的数据已经是一个十六进制的字符串。 所以我只是将它拆分并放入数组中。 这至少可以使文件的大小正确。 但是,我的新问题是它正在裁剪每个字节的第二部分并将其替换为0(在十六进制编辑器中查看时)......但是当我打印时,数组的元素会获得正确的数据。 有任何想法吗? 新代码如下:

# Format data string into an array for file processing
@data_ary = split //, $data_str;
generate_new_file($filname, \@data_ary);


sub generate_new_file
{
     my $fname = "mod -" . shift(@_);
     my $aref = shift(@_);

     open(BIN, ">", $fname) or die;
     binmode(BIN);

     for (my $i = 0; $i < @$aref; $i += 2)
     {
         my ($hi, $lo) = @$aref[$i, $i+1];
         print BIN pack "H", $hi.$lo;
     }

     close(BIN);
}

我想到了! 我在调用pack时忘记了“*”,所以它不仅仅是第一个角色! 完成的代码如下。 谢谢阿蒙!

# Format data string into an array for file processing
@data_ary = split //, $data_str;
generate_new_file($filname, \@data_ary);


sub generate_new_file
{
     my $fname = "mod -" . shift(@_);
     my $aref = shift(@_);

     open(BIN, ">", $fname) or die;
     binmode(BIN);

     for (my $i = 0; $i < @$aref; $i += 2)
     {
         my ($hi, $lo) = @$aref[$i, $i+1];
         print BIN pack "H*", $hi.$lo;
     }
     close(BIN);
}

这里, unpack返回一个字符串,而不是一个值数组。 如果你想要一个十六进制字符数组(每个字符表示4位),那么你必须split结果字符串:

my @data = split //, unpack "H*", $data;

(使用split /..\\K/, $data分割成等效的字节)

在将此数据打印到文件句柄之前,您还必须将其pack以再次获取原始数据。 我建议至少在原始数据的8位部分执行此操作:

for (my $i = 0; $i < @$aref; $i += 2) {
   my ($hi, $lo) = @$aref[$i, $i+1];
   print OUT pack "H*", $hi.$lo;
}

暂无
暂无

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

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