我正在尝试使用perl为NEMA(GPS协议)字生成校验和。 NEMA字样本是字符串,如下所示
$GPGLL,5300.97914,N,00259.98174,E,125926,A*28
通过对$
和*
之间的所有字符进行XOR计算校验和。在这句话中,校验和是十六进制值28的字符表示。
我尝试了以下内容:
my $NMEA_word = 'GPGLL,5300.97914,N,00259.98174,E,125926,A';
my $uff = unpack( '%8A*', $NMEA_word );
print "Hexadecimal number: ", uc(sprintf("%x\n", $uff)), "\n";
但它似乎没有给出正确的价值。请说明应该纠正的内容
答案 0 :(得分:4)
my $uff;
$uff ^= $_ for unpack 'C*', 'GPGLL,5300.97914,N,00259.98174,E,125926,A';
printf "Hexadecimal number: \U%x\n", $uff;
__END__
Hexadecimal number: 28
答案 1 :(得分:3)
更多功能,
use List::Util 'reduce';
sub checksum {
sprintf '%02X', ord reduce { our $a ^ our $b } split //, shift;
}
print checksum('GPGLL,5300.97914,N,00259.98174,E,125926,A'), "\n";
答案 2 :(得分:1)
生成校验和的unpack
工具将字段值一起添加,然后你想要XORed。
这个程序可以满足您的要求。
use strict;
use warnings;
my $NMEA_word = 'GPGLL,5300.97914,N,00259.98174,E,125926,A';
printf "Hexadecimal number: %s\n", checksum($NMEA_word);
sub checksum {
my ($string) = @_;
my $v = 0;
$v ^= $_ for unpack 'C*', $string;
sprintf '%02X', $v;
}
<强>输出强>
Hexadecimal number: 28