2012-06-21 64 views
2

嘿,所以我遇到了一些問題,從PHP我必須從二進制文件中讀取一些數據,其中空間是最重要的,所以他們已經在地方使用24位整數。24bit int in php

現在對於大部分數據我可以拆開看不過收拾/解壓縮不支持24位的int的:■

我想我也許可以簡單的讀取數據(例如說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. 

有沒有人有過處理過這個?任何解決方案建議?

+0

的是速度非常重要,或者你可以住一個簡單的解決方案,即使不是最快? –

+6

難道你不能只用一個空字節填充它嗎?像'$ buffer = unpack(「N」,「\ x00 $ data」);' – DaveRandom

+0

感謝戴夫似乎已經工作! <3 – Joe

回答

0

如果文件只有3個字節,最簡單的方法就是填充@DaveRandom所說的。但如果這是一個長文件,這種方法變得效率低下。

在這種情況下,您可以將每個元素讀取爲char和short,然後通過按位運算符重新對其進行重新打包。

或者您可以將12個字節作爲3個長整型讀取,然後使用按位運算符將其分成4組3個字節。剩餘的字節將被上述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; 
} 

以下question有一個示例代碼解壓的24/48位的字符串太