如何使用perl为字符串生成XOR校验和

时间:2013-06-12 17:14:00

标签: perl

我正在尝试使用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";

但它似乎没有给出正确的价值。请说明应该纠正的内容

3 个答案:

答案 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