Moin!
Du machst aus dem String ein Array mit Byte-Integerwerten.
Und dann machst du in deiner Funktion toSint() aus dem Arraywert wieder einen String, auf den du dann unpack() anwendest. Klingt irgendwie nach einem Irrweg, oder? Zumal ein Array von Integerwerten deutlich mehr Speicher verbraucht, als ein String. Wenn die gelesene Datenmenge also hinreichend groß ist, kriegst du damit noch ganz andere Probleme.
Nun, socket_read() gibt unter php warum auch immer einen String zurück. Die rohe recv() Socket Betriebssystemfunktion schreibt meine Daten in einen "char* buf", was in C üblicherweise ein char-Array ist.
Du bist im PHP-Land. Vergiss alles, was für C gilt, denn C hat im PHP-Land keine Bedeutung. Auch nicht, wenn PHP namensgleich auf C-Funktionen zurückgreift.
Es kann später auch sein, dass ich aus dem Datenstrom auf ein einzelnes Byte zugreifen möchte (quasi ein int8_t). Das müsste dann auch mittels Ord() in den entsprechenden Wert gewandelt werden.
Ein einzelnes Zeichen eines Strings erreichst du über den vom Array bekannten Indexzugriff:
$str = "abc";
$i = 1;
echo $str[$i] // 'b'
Wenn das "blöd" ist (z.B. für mehrere Zeichen), gibts auch noch die Stringfunktion substr():
echo substr($str,$i,1); // 'b'
Und die Funktion ord() liefert dir den Bytewert des Zeichens, also uint8_t, wenn du so willst - nicht jedoch int8_t. Oder nur für Zeichen mit ASCII-Werten kleiner 128. ;)
Ich halte es jedoch aus Logikgründen für ungünstig, im Kontext von "ein Interface liefert mir Bytewerte als String verpackt" etwas anderes als unpack() zum Wandeln in Integer zu verwenden. Diese Sonderbehandlung von uint8_t durch ord() wäre nicht selbsterklärend. Außer du verzichtest komplett auf unpack() und rechnest dir die gewünschten Bytewerte lieber mit ord() und Mathematik selber aus.
- Sven Rautenberg