如何以十六进制格式从 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 中获取校验和?的主要内容,如果未能解决你的问题,请参考以下文章

perl中的pack与unpack

如何在java中解压二进制文件?

关于 unpack() 和 printf() 中的 v 标志的 Perl 问题

对于具有数据的二进制数据文件,在 struct unpack 命令中选择啥格式:b'@T\x89\x00\x00\x00\x00\x80$\xcds?

python读取C#写的二进制文件,byte类型unpack

如何从 MySQL/MariaDB 中的二进制列格式化 uuid 字符串