/ / Jak wygenerować sumę kontrolną XOR dla ciągu znaków za pomocą perl - perl

Jak wygenerować sumę kontrolną XOR dla ciągu znaków za pomocą perl - perl

Próbuję wygenerować sumę kontrolną dla słowa NEMA (protokołu GPS) za pomocą perl. Przykładowe słowo NEMA to ciąg znaków, jak pokazano poniżej

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

Suma kontrolna jest obliczana przez przyjęcie XOR wszystkich znaków pomiędzy $ i *. W tym zdaniu suma kontrolna jest reprezentacją znaków liczby szesnastkowej 28.

Próbowałem następujące:

my $NMEA_word = "GPGLL,5300.97914,N,00259.98174,E,125926,A";
my $uff = unpack( "%8A*", $NMEA_word );
print "Hexadecimal number: ", uc(sprintf("%xn", $uff)), "n";

Ale nie wydaje się, aby podać poprawną wartość. Proszę zasugerować, co należy poprawić

Odpowiedzi:

4 dla odpowiedzi № 1
my $uff;
$uff ^= $_ for unpack  "C*", "GPGLL,5300.97914,N,00259.98174,E,125926,A";
printf "Hexadecimal number: U%xn", $uff;
__END__
Hexadecimal number: 28

3 dla odpowiedzi № 2

Bardziej funkcjonalnie,

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";

1 dla odpowiedzi nr 3

The unpack narzędzie do generowania sumy kontrolnej dodaje wartości pól razem, a następnie XORed.

Ten program zrobi to, o co poprosisz.

use strict;
use warnings;

my $NMEA_word = "GPGLL,5300.97914,N,00259.98174,E,125926,A";

printf "Hexadecimal number: %sn", checksum($NMEA_word);

sub checksum {
my ($string) = @_;
my $v = 0;
$v ^= $_ for unpack "C*", $string;
sprintf "%02X", $v;
}

wydajność

Hexadecimal number: 28