2

ちょっとした問題に遭遇しました.PHPから、スペースが最も重要なバイナリファイルからデータを読み取る必要があるため、24ビット整数が使用されています。

現在、ほとんどのデータを unpack で読み取ることができますが、pack/unpack は 24 ビット int の :s をサポートしていません。

おそらく、データ (たとえば 000104) を H* として単純に読み取り、それを正しい var に読み込ませることができると思いました。

// example binary data say I had the following 3 bytes in a binary file
// 0x00, 0x01, 0x04

$buffer = unpack("H*", $data);

// this should equate to 260 in base 10 however unpacking as H* will not get
// this value.

// now we can't unpack as N as it requires 0x4 bytes of data and n being a 16 bit int
// is too short.

誰もこれに対処しなければなりませんでしたか?解決策はありますか?アドバイス?

4

1 に答える 1

0

上記のようにファイルに 3 バイトしかない場合、@DaveRandom が言ったように、最も簡単な方法はパディングです。ただし、長いファイルの場合、この方法は非効率的になります。

この場合、各要素を char および short として読み取り、その後ビットごとの演算子で再パックできます。

または、12 バイトを 3 つの long として読み取り、ビットごとの演算子を使用して 3 バイトの 4 つのグループに分割することもできます。残りのバイトは、上記の 2 つの方法で抽出されます。これは、大規模なデータに対する最速のソリューションになります。

unsigned int i, j;
unsigned int dataOut[SIZE];

for (i = 0, j = 0; j < size; i += 4, j += 3)
{
    dataOut[i]     = dataIn[j] >> 8;
    dataOut[i + 1] = ((dataIn[j] & 0xff) << 16) | (dataIn[j + 1] >> 16);
    dataOut[i + 2] = ((dataIn[j + 1] & 0xffff) << 8) | (dataIn[j + 2] >> 24);
    dataOut[i + 3] = dataIn[j + 2] & 0xffffff;
}

次の質問には、24/48 ビットの文字列も展開するサンプル コードがあります。

于 2013-07-31T04:37:14.083 に答える