WebWork Magazin - Webseiten erstellen lassen, Online Medien, html

Webhoster, Webhosting Provider und Domain registrieren

Home | Registrieren | Einloggen | Suchen | Aktuelles | GSL-Webservice | Suleitec Webhosting
Reparatur-Forum | Elektro forum | Ersatzteilshop Haushalt und Elektronik


Homepage und Webhosting-Forum

Scripte und Programme für PHP, MYSQL. Diskussionen zur Programmierung im Web. Fragen zu CMS, Blogsoftware, Shops, Newsletter und vielen weiteren Scripten.


Forum » PHP & MySQL » CRC 16 » Antworten
Benutzername:
Passwort: Passwort vergessen?
Inhalt der Nachricht: Fett | Kursiv | Unterstrichen | Link | Bild | Smiley | Zitat | Zentriert | Quellcode| Kleiner Text
Optionen: Emailbenachrichtigung bei Antworten
 

CRC 16
von mschrotlich
he,

da fällt mir noch ein:
Warum teilst du die Länge des Strings durch zwei?


ich schrieb:
(also ich lese eine Hexzahl ein)


Klar oder ?

mfG...
von mschrotlich
Hi,

danke für die hilfe, der Quell von den Link haut spitze hin.

Ja, eine Antwort auf deine Fragen, programmiere seit über 20 Jahren nur Pascal (jetzt eben Delphi), und PHP ist doch ziemlich C belastet. Darum komme ich noch absolut nicht klar, bin imemr froh wenn ein script funktioniert.
Ach ja, habe den gleichen Quell für Delphi, und kann auf die mySQL Datenbank per Port zugeifen, dadurch ist dann auch die gleiche CRC von Delphi und PHP möglich. Getestet habe ich es aber noch nicht, werde ich jetzt am WE machen.
Danke noch mal!

mfG...
von Ori
Abgesehen davon, dass der Code sehr unübersichtlich ist, wird wohl

1:
if ($droppedbit = 1)  $crc_ = crc_ ^ $a001;


Auslöser des Versagens sein. Da sind gleich drei Fehler drin. Oder aber, dass du $crc_ und $a001_ als Strings belegt hast, sie aber Integer sein sollten.

Ein paar rhetorische Fragen, die mir dazu noch einfallen:
Was sollen die Unterstriche? Warum formatierst du deinen Code nicht? Warum benennst du die Variablen um, wenn du den Code portierst? Warum teilst du die Länge des Strings durch zwei? Warum nimmst du nicht einfach Code, den jemand anders geschrieben hat, und der funktioniert? (Suche: php crc16. Finde das hier).
von mschrotlich
Hallo,

ja, habe es auch anders gemacht, habe jetzt eine CRC Function gefunden die zwei Char als Ergebnis liefert.

Mir ging es eigentlich darum, warum die Function immer 0 ausgab. Wo hatte ich da einen Fehler bei der Umsetzung.
von Ori
MySQL kann Indizes auch auf varchar-Spalten einrichten. Benutz sie.

Ergebnis: Es ist schnell und du musst nicht eine Zeile Code ändern.
von mschrotlich
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!

Nach oben