Das ist aber nicht die gleiche CRC16-Routine wie die aus dem Modul Digest::CRC!
So sollte das Skript gehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/perl
use strict;
use warnings;
my $strToSend = "\xfe\x04\x01";
my $CRC16 = GetCRC16($strToSend. "\x00\x00"); # ergibt "BED2"
print "Checksum 1: ". sprintf("%X", $CRC16). "\n";
my $strReceived = "\xfe\x04\x01\xbe\xd2";
$CRC16 = GetCRC16($strReceived); # ergibt 0
print "Checksum 2: ". sprintf("%X", $CRC16). "\n";
sub GetCRC16 {
my $s = shift;
my $CRCreg = 0xffff00;
for (my $cp=0; $cp<length($s); $cp++) {
$CRCreg |= ord( substr($s,$cp,1) );
for (my $bp=0; $bp<8; $bp++) {
$CRCreg <<= 1;
if ($CRCreg & 0x1000000) {
$CRCreg ^= 0x100200; # hier ist das Polynom 0x1002 enthalten
}
$CRCreg &= 0xffffff;
}
}
return $CRCreg >> 8;
}
1;
\n\n
<!--EDIT|GwenDragon|1174570576-->