2016-04-23 11 views
2

コンテキスト:私はデータを読み書きしていますが、格納の理由から24ビットの整数(符号付きまたは符号なしは実際には8進数の値なので問題ありません)です。私はpackunpackでこれらの整数の多くを保存/読み込む必要があります。このアプリケーションはスペース上重要なので、32ビット整数を使用することは望ましくありません。pack PHPの24ビット整数のリスト

しかし、packには24ビット整数のオプションがないようです。どのようにこれを扱うのですか?私は現在、

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

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

カスタム関数を使用しますが、おそらく、より直接的な方法があるのですか?

+1

24ビットを与えるフォーマット文字列 "CS"を使用できますか? – Graeme

+0

phpのintサイズがプラットフォームに依存することに注意してください。 32ビットにすることができます。彼らはまた、64ビットになる可能性があります –

+0

@ nl-xその発言が私の質問にどう関係しているか説明できますか?私は24ビットが私が働いているときにこれが重要だとは思わない。 – user1111929

答えて

2

私が知っている現代のCPUには、24ビット整数のようなものはありません。なぜなら、あなたが望むパッキングが直接サポートされていないからです。

提案したように、個々にバイトをパックすることをお勧めします。エンディアンを気にしてください。

+0

「エンディアンを気にする」という意味を指定できますか? http://php.net/manual/en/function.pack.phpを見ると、 'C'は私の唯一のフラグオプションだと思われます。エンディアンの指定の余地はありません。 – user1111929

+0

@ user1111929:まったく。データをバイトに分割して、もう一方の端で再び結合するときには、自分でそれを管理する必要があります。ある時点で、それらのことを行うコードがどのように見えるかを決定する必要があります。パックされたバイト表現で使用することを決めたエンディアンを記録するだけで十分です。 –

+0

私はその理由を理解していますが、私はその方法を理解していません。使用するエンディアンをどのように決定するのですか?システムが自動的に私のためのエンディアンを決定し、それを私に提供しないように思えます。将来のシステムがそれを逆に解釈すると、実際には悲惨な結果をもたらすでしょうが、私は「C」フラグしか持っていないので、それに対抗する方法は見当たりません。 – user1111929

関連する問題