0

perl を使用して NEMA(GPS プロトコル) ワードのチェックサムを生成しようとしています。サンプルの NEMA 単語は、以下に示す文字列です。

$GPGLL,5300.97914,N,00259.98174,E,125926,A*28

$チェックサムは、との間のすべての文字の XOR をとることによって計算され*ます。この文では、チェックサムは 16 進数値 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";

しかし、それは正しい値を与えていないようです。何を修正するか提案してください

4

3 に答える 3

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
于 2013-06-12T17:24:04.757 に答える
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";
于 2013-06-12T17:53:46.787 に答える