2016-04-23 10 views
2

Kontext: Ich lese/schreibe Daten, die aus Speichergrund als 24-Bit-Ganzzahlen kommt (mit oder ohne Vorzeichen ist nicht wichtig, da sie tatsächlich 8 Oktalwerte sind). Ich muss eine große Anzahl dieser Ganzzahlen mit pack und unpack speichern/lesen. Da die Anwendung platzkritisch ist, ist die Verwendung von 32-Bit-Ganzzahlen nicht wünschenswert.pack Liste der 24-Bit-Ganzzahlen in PHP

Allerdings scheint Pack keine Option für 24-Bit-Ganzzahlen zu haben. Wie geht man damit um? Ich verwende derzeit eine benutzerdefinierte Funktion

function pack24bit($n) { 
    $b3 = $n%256; 
    $b2 = $n/256; 
    $b1 = $b2/256; 
    $b2 = $b2%256; 
    return pack('CCC',$b1,$b2,$b3); 
} 

und

function unpack24bit($packed) { 
    $arr = unpack('C3b',$packed); 
    return 256*(256*$arr['b1']+$arr['b2'])+$arr['b3']; 
} 

aber vielleicht gibt es mehr direkte Wege?

+1

Könnten Sie die Formatzeichenfolge "CS" verwenden, die 24 Bit ergibt? – Graeme

+0

beachten Sie, dass die PHP-Int-Größe plattformabhängig ist. Sie könnten 32 Bit sein. Sie könnten auch 64 Bit sein –

+0

@ nl-x Könnten Sie erklären, wie sich diese Bemerkung auf meine Frage bezieht? Ich glaube nicht, dass das wichtig ist, wenn ich mit 24 Bits am meisten arbeite. – user1111929

Antwort

2

Es gibt keine 24-Bit-Ganzzahl auf jeder modernen CPU, die ich kenne, weshalb Ihre gewünschte Verpackung nicht direkt unterstützt wird.

Ich empfehle Ihnen, Ihre Bytes einzeln zu packen, wie Sie vorgeschlagen haben. Achte auf Endianess.

+0

Können Sie angeben, was Sie unter "Endgültigkeit beachten" verstehen? Wenn man sich http://php.net/manual/en/function.pack.php anschaut, scheint es, dass "C" meine einzige Flag-Option ist, es gibt keinen Raum für die Spezifizierung von Endianess. – user1111929

+0

@ user1111929: Genau. Sie müssen das selbst verwalten, wenn Sie Ihre Daten in Bytes aufteilen und dann am anderen Ende wieder zusammenfügen: Irgendwann müssen Sie entscheiden, wie der Code für diese Dinge aussehen wird. Es sollte ausreichen, nur zu dokumentieren, welche Endianie Sie in Ihrer gepackten Byte-Darstellung verwendet haben. –

+0

Ich verstehe das Warum, aber ich verstehe das nicht. Wie entscheide ich, welche Endlichkeit ich verwenden soll? Es scheint mir, als ob das System automatisch die Endgültigkeit für mich entscheidet und mir dabei keine Wahl bietet. Was in der Tat eine katastrophale Wirkung haben würde, wenn ein zukünftiges System es anders herum interpretiert, aber ich sehe nicht, wie man dem entgegenwirkt, wenn ich nur die C-Flagge habe. – user1111929