作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我用例如产生的十六进制值
my $hex = sprintf "%v02X", $packed_output
$packed_output
是 pack
对一系列数字的结果,即
my $packed_output = pack "L>*", map { $_->[0] << 16 | $_->[1] } @array;
有没有办法从 $ hex
字符串中取回 $packed_output
?
最佳答案
一种方法:按句点拆分字符串,并使用 hex
将所有十六进制字符串字节转换回数字,然后再次将它们全部打包:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $packed_output = pack "L>*", 1, 2, 3, 4, 5, 6;
my $hex = sprintf "%v02X", $packed_output;
# $hex is
# 00.00.00.01.00.00.00.02.00.00.00.03.00.00.00.04.00.00.00.05.00.00.00.06
my $binary = pack "(h2)*", map(hex, split(/\./, $hex));
$Data::Dumper::Useqq = 1;
print Dumper($packed_output, $binary);
# Outputs
# $VAR1 = "\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6";
# $VAR2 = "\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6";
虽然听起来您真正想要的是一种在二进制数据和文本数据之间进行往返转换的简单方法。使用 sprintf
来生成像上面那样的十六进制向量字符串是不是。
Perl 支持行业标准 Base64 encoding , 和旧的 uuencode (它是通过 pack
和 unpack
内置的,而不是核心模块)。示例:
#!/usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use feature qw/say/;
my $packed_output = pack "L>*", 1, 2, 3, 4, 5, 6;
# Base64
my $base64 = encode_base64($packed_output, "");
print $base64; # AAAAAQAAAAIAAAADAAAABAAAAAUAAAAG
my $decoded_b64 = decode_base64($base64);
say "It's a match!" if $packed_output eq $decoded_b64;
# uuencode
my $uuencoded = pack "u", $packed_output;
print $uuencoded; # 8`````0````(````#````!`````4````&
my ($decoded_uu) = unpack "u", $uuencoded;
say "Another match!" if $packed_output eq $decoded_uu;
关于perl - 从十六进制字符串中恢复包值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74580910/
我是一名优秀的程序员,十分优秀!