2017-05-11 1 views
1

Ich postete dies (php pack: problems with data types and verification of my results) und festgestellt, dass ich zwei Probleme hatte. Also hier nochmal nur ein Problem (ich habe das andere gelöst) Hoffentlich ist das einfach zu verstehen: Ich möchte die PHP pack() Funktion verwenden. 1) Mein Ziel ist es, jede Integer-Zahl info ein hex eine der Länge 2 Bytes zu konvertieren. Beispiel: 0d37 -> 0x0025PHP Pack: verstehe nicht wirklich

2) Zweites Ziel ist, hohe/niedrige Byte jedes Wert umzuschalten: 0x0025 -> 0x2500 3) Es gibt viele Eingangswerte, die 12-Bytes von binären Daten bilden.

Kann mir jemand helfen?

Antwort

2

Sie müssen nur die Format-Tabelle in der pack() manual page suchen und es ist ziemlich einfach.

2 Bytes bedeutet 16 Bit, oder auch "kurz" genannt. Ich nehme an, Sie wollen das unsigned ... so erhalten wir n für Big Endian (hoch) und v für Little Endian (niedrig) Byte-Reihenfolge.

Die einzige potenziell heikeler Teil heraus herauszufinden, wie das Format und die Parameter zu kombinieren, da jedes Format Zeichen auf einen Wert Argument gebunden ist:

bin2hex(pack('nv', 34, 34)) // returns 00222200 

Wenn Sie eine variable Anzahl von Werten benötigen, werden Sie müssen agument Auspacken (eine PHP-Sprache-Funktion, nicht mit unpack() verwechseln):

$format = 'nv'; 
$values = [34, 34]; 
pack($format, ... $values); // does the same thing 

Und alternativ, wenn alle Ihre Werte sollten mit dem gleichen Format verpackt werden, könnten Sie dies tun:

pack('v*', $values); // will "pack" as many short integers as you want 
+0

Mein Rechner sagt 37dec ist 0x25 ... Wie auch immer Sie mich zum Kern des Problems führen: Wenn ich das reine binäre Datenecho (und ich nehme printf auch) echo, interpretiere diese Daten als char und drucke das ASCII Charakter. Sieht aus wie bin2hex(), um die Daten anzuzeigen. Ich denke, mir geht es jetzt gut, vielen Dank! – Stefatronik

+0

In der Tat ... Ich hatte 34 statt 37 überall eingegeben. Ich weiß nicht, was ich dachte. – Narf

Verwandte Themen