Hallo Rainer, hallo Ernst,
PHP ist, wie viele andere Programmiersprachen auch, eine freundliche Programmiersprache. Sie erlaubt es dem Programmierer Zahlen in verschiedenen Repräsentationen zu verwenden.
Folgende Zahlen sind absolut identisch:
$CRC16 = 48850;
$CRC16 = 0xBED2;
In beiden Fällen besitzt $CRC16 exakt den selben Wert.
Es besteht also nicht der geringste Grund erst umständlich irgendwelche Umwandlungen vornehmen zu müssen.
Daraus folgt:
Das HiBYte von 48850 ist identisch mit dem HiByte von 0xBED2, nämlich 190 (dec) bzw. 0xBE (hex).
Das LoBYte von 48850 ist identisch mit dem LoByte von 0xBED2, nämlich 210 (dec) bzw. 0xD2 (hex).
Das unsägliche „Gefummel“ mit hex2asc(…), hexdec(…), sprintf(…) und str_repeat(…) ist absolut überflüssig und ist lediglich ein Zeichen dafür, dass hier die verschiedenen Darstellungsweisen von Zahlen nicht verstanden wurde.
Da der Datentyp Character nichts anderes ist als ein Byte, kann man sich einen String als die Aneinadereihung von Bytes denken. Wenn also die Zahl 48850 als String ausgegeben werden soll, wird diese in Hi- und LoByte aufgeteilt und als Folge von zwei Bytes übertragen. Damit PHP unsere Bytes nicht in lesbare ASCII-Zeichen wandelt, müssen wir ihm durch die Funktion chr(…) mitteilen, dass es diese Bytes bereits als Character betrachten soll und sie also so belassen soll, wie sie sind.
In meinem vorher genannten Beispiel ist $CRC16str bereits die String-Variante der Integer Checksumme $CRC16.
Dass wir in der String-Darstellung manchmal die hexadezimale Schreibweise ("\xBE\xD2") bevorzugen liegt daran, dass man damit eben alle 256 Bitkombinationen eines Bytes darstellen kann. Mit ASCII-Zeichen ist das eben nicht möglich, da einige davon nicht darstellbar sind, wie z.B. Wagenrücklauf (CR=13=0x0D=ord("\x0D")) oder Zeilenvorschub (LF=10=0x0A=ord("\x0A")).
Gruß
HJH