如何以十六进制格式从 unpack 中获取校验和?
Posted
技术标签:
【中文标题】如何以十六进制格式从 unpack 中获取校验和?【英文标题】:How do I get a checksum from unpack in hexadecimal format? 【发布时间】:2011-02-22 20:27:57 【问题描述】:我一直在尝试找出 Perl 中的 unpack 函数,但无法完全弄清楚。
我有什么:
一个字符串和一个 16 位十六进制校验和
(例如"this is my string"
、"0671"
)
我需要检查 "this is my string"
是否等于校验和 '0671'
。
所以我知道unpack("%16W*", $string)
会给我 16 位十进制值,但我需要十六进制表示。我知道这很容易,所以请原谅我的无知。
【问题讨论】:
【参考方案1】:正如你所说,unpack("%16W*", $string)
给你一个整数。要将整数转换为十六进制,请使用sprintf:
my $string = "this is my string";
my $expected = '0671';
my $checksum = sprintf('%04x', unpack("%16W*", $string));
print "match\n" if $checksum eq $expected;
如果您需要大写十六进制数字,请使用 %X
而不是 %x
(或在本例中为 %04X
)。
或者,您可以换一种方式,使用hex 将您的十六进制校验和转换为整数:
my $string = "this is my string";
my $expected = '0671';
my $checksum = unpack("%16W*", $string);
print "match\n" if $checksum == hex $expected; # now using numeric equality
【讨论】:
非常感谢,您给出的最佳解决方案是正确的。这样的生活品味,我居然开始自己做,我很沮丧哈哈【参考方案2】:试试unpack("b*',$string)
。
语法见pack man page。
【讨论】:
这给出了整个字符串的位表示以上是关于如何以十六进制格式从 unpack 中获取校验和?的主要内容,如果未能解决你的问题,请参考以下文章
关于 unpack() 和 printf() 中的 v 标志的 Perl 问题
对于具有数据的二进制数据文件,在 struct unpack 命令中选择啥格式:b'@T\x89\x00\x00\x00\x00\x80$\xcds?