Gå til innhold

Hjelp til å forstå utregning i Perl-script.


Anbefalte innlegg

Heisann.. Noen som kan hjelpe meg med å forstå hvordan selve utregningen i dette Perl-scriptet foregår?

 

sub toled {
my $page = shift;
my $str = shift;

# calculate checksum
my $checksum = 0x74;
for (0..length($str)-1) {
	my $c = ord(substr($str,$_));
	$checksum = $checksum ^ $c;
}
# construct basic "display this on page $page" message
my $ledcode = sprintf("<ID00><L1><P%s><FE><MA><WC><FE>%s%02X<E>",
					  uc($page), $str, $checksum);
# send to serial device /dev/ttyS0
open SERIAL, ">/dev/ttyS0";
print SERIAL $ledcode;
close SERIAL;
}

 

For eksempel har man kommet frem til at denne selve teksten i denne linjen her har generert checksumen 4B.

 

<ID00><L1><PA><FE><MA><WC><FE>Text message entered4B<E>

Lenke til kommentar
  • 3 måneder senere...
Videoannonse
Annonse
Heisann.. Noen som kan hjelpe meg med å forstå hvordan selve utregningen i dette Perl-scriptet foregår?

 

[...]

 

En checksum brukes ofte for å verifisere at det som tas imot på andre siden er nøyaktig det samme som ble sendt. Denne koden gjør et forsøk på det.

 

Først gir man $checksum en startsum som begge sider er blitt enige om.

my $checksum = 0x74;

 

Så går man igjennom hvert enkelt tegn i strengen $str

for (0..length($str)-1) {
my $c = ord(substr($str,$_));

(ord() gir den numeriske verdien av det første tegnet[1] i det substr() returnerer[2]. Det substr returnerer er alle tegn fra posisjon $_ i strengen $str).

 

Så tar den verdien av tegnet og utfører en XOR-operasjon[3]

	$checksum = $checksum ^ $c;

 

Når loopen er ferdig står du igjen med et 8bit tall som sendes med kommandoen. Prøver du å sende noe annet, slik som unicode/utf-8 vil dette nok feile, siden nummerverdien for tegn ofte ikke begrenser seg til 8 bit, men det er en helt annen historie.

 

Mulig denne koden, som gjør samme jobb med litt mindre kode, er lettere å forstå;

my $checksum = 0x74;
foreach my $char  (split '', $str) {
$checksum ^= ord($char);
}

 

:)

 

 

[1] http://perldoc.perl.org/functions/ord.html

[2] http://perldoc.perl.org/functions/substr.html

[3] http://perldoc.perl.org/perlop.html

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...