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
Videoannonse
Annonse
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>

 

det loopes over hvert tegn i inputstring og gjøres en xor på ascii verdi til hver av disse mot "checksum", en tallverderdi som endres underveis.

 

Om første bokstav var a (som er ascii verdi 97 (fra ord() funksjon)), får vi:

	#0x74 (hex): 1110100 (bin)
#97(dec)   : 1100001 (bin)
#-------------------------
#0x74^97   : 0010101 (bin) (dvs 21 dec, som benyttes som $checksum mot neste tegn)

Lenke til kommentar
  • 3 uker senere...

interessant at noen faktisk trenger hjelp til akkurat det samme som meg.

 

 

en ting jeg lurer på, er om den begynner på slutten av stringen, siden step = -1 i koden.

 

jeg holder på å prøve å gjenskape denne i visual basic, som et systray program som skal kjøre hele tiden.

 

er det noen som er villige til å hjelpe littegran med dette?

Endret av mobents
Lenke til kommentar
en ting jeg lurer på, er om den begynner på slutten av stringen, siden step = -1 i koden.

 

Uhmnai, step er ikke -1. Hvis du ser litt nærmere etter står det 'for (0..length($str)-1)', altså: fra null til lengden på strengen minus 1 (siden vi begynner å telle på 0 i stedet for 1). Step er ikke angitt eksplisitt---jevnfør 'for each (@array)', hvor den stepper seg gjennom en liste. Samme greia her, bare at lista er gitt ved (0..n).

 

jeg holder på å prøve å gjenskape denne i visual basic, som et systray program som skal kjøre hele tiden.

 

ouch :\

Lenke til kommentar
  • 4 uker senere...
jeg holder på å prøve å gjenskape denne i visual basic, som et systray program som skal kjøre hele tiden.

 

er det noen som er villige til å hjelpe littegran med dette?

 

Hvordan gikk det med prosjektet? Fikk du gjennomført det? Isåfall hadde det vært flott om du hadde delt det med meg... Jeg har et PHP-script som gjør utregningene, men hadde vært greit å gjort det i selve programmet..

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...