/ / Como gerar soma de verificação XOR para uma string usando perl - perl

Como gerar uma soma de verificação XOR para uma string usando perl - perl

Estou tentando gerar soma de verificação para uma palavra NEMA (protocolo GPS) usando perl. Uma palavra NEMA de amostra é uma sequência de caracteres, como mostrado abaixo

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

A soma de verificação é calculada usando XOR de todos os caracteres entre $ e *. Nesta sentença, a soma de verificação é a representação de caracteres do valor hexadecimal 28.

Eu tentei o seguinte:

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

Mas isso não parece dar um valor correto. Por favor, sugira o que deve ser corrigido

Respostas:

4 para resposta № 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 para resposta № 2

Mais funcionalmente,

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 para resposta № 3

o unpack facilidade para gerar uma soma de verificação adiciona os valores do campo juntos, enquanto você deseja XORed.

Este programa fará o que você pede.

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

saída

Hexadecimal number: 28