Hallo,
ich wollte ein CRC16 berechnen in PHP, nur leider funktioniert es nicht.
Hier mein Versuch:
(also ich lese eine Hexzahl ein)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23: | function crc_16($Str)
{
$crc_ = '0xFFFF';
$a001_ = '0xA001';
$Pos_ = 0;
for ($Sf = 1; $Sf <= (strlen ($Str) / 2); $Sf ++)
{ $BoM = hexdec($Str[$Pos_] . $Str[$Pos_ + 1]);
$Pos_ ++; $Pos_ ++;
$crc_ = $crc_ ^ $BoM;
for ($Sb = 1; $Sb <= 8; $Sb ++)
{ $droppedbit = $crc_ & 1;
$crc_x = 0;
if ($crc_ & 1) $crc_x = 32768;
$crc_ = $crc_ >> 1;
$crc_ = $crc_ | $crc_x;
if ($droppedbit = 1) $crc_ = crc_ ^ $a001;
}
}
return $crc_;
}
|
und hier der Quell wo ich es her habe, scheinbar Delphi for PHP, sieht wie ein Pascal Quell aus, nur fehlen die Simekolons bei den "end"
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18: |
function crc = crc16(str)
crc = uint16(hex2dec('FFFF'));
a001 = uint16(hex2dec('A001'));
for i=1:length(str)
ByteOfMessage = str(i);
crc = bitxor(crc,ByteOfMessage);
for j=1:8
droppedbit=bitget(crc,1);
crc = bitshift(crc,-1);
if droppedbit
crc = bitxor(crc,a001);
end
end
end
|
Könnte mir da jemand weiter helfen, oder gibt es schon was fertiges ?
Das es CRC32 intern gibt ist mir bekannt. Das sind aber 4 Byte, bei 16 Bit sind es nur 2 Byte, soll in eine mySQL Datenbank als Indiz die Datenbank schnell machen. Also einen String anhand des CRC Wertes finden.
Danke!