2010-07-15 53 views
0

我有一些二進制數據,它有一個相應的「映射」文件,它通過提供位偏移和長度來標識二進制數據中的每個數據點。所以,我可能有以下映射:PHP:從二進制數據的任意偏移位置讀取任意位數

$paths = array ("path1" => array ("offset" => 224, "size" => 2), 
       "path2" => array ("offset" => 226, "size" => 6), 
); 

實際上我有數以萬計的這些路徑來抵消/尺寸映射。現在,給定一條路徑,我希望能夠找到適當的偏移量並讀取按大小給出的位數。在這種簡單的情況下,path1和path2表示一個字節,其中path1是前2位,path2是後6位。

我已經用Python寫這個,我現在在移植代碼到PHP的原因,我不會去:)

無論如何,對於整個字節大小在整個字節偏移我可以只使用與解壓適當的格式字符串。我遇到的問題是如何處理這些「奇怪」大小的位組。

我到目前爲止想到的唯一方法是找到偏移模量8給出0(整個字節)並且小於給定偏移量的最近位偏移量,然後找到最小尺寸(再次以整個字節大小)從包含所有必需位的新偏移量開始,然後使用按位&來屏蔽我想要的位。

在Python中,我可以只使用bitbuffer模塊,它讓我尋找一個位偏移量,然後讀取任何我想要的位數。在PHP世界裏有這樣的事情嗎?

謝謝。

回答

0

你的解決方案抓住整個字節,然後使用一個位掩碼聽起來就像做它的方式。那麼我想你也會做一個右移,因爲你感興趣的位可能沒有在字節邊界上結束。

這將是一個緩慢的做法,但我不知道任何可以做這種事情的內部PHP函數。

+0

這是我害怕**的答案。 – sberry 2010-07-15 05:05:03

+0

我想像做一些像(0xffff <<(32- $ leftoffset))| (0xffff >>(32- $ rightoffset))來創建位掩碼 - ooh請注意,在64位PHP中,您的整數將是64位,因此可能需要修改上述內容。請注意,如果沒有庫函數的話,在PHP中進行任何類型的二進制處理都會很慢,而且我99%肯定沒有(這裏有一個很小的機會,我只是不知道它) 。 – thomasrutter 2010-07-15 15:14:57

相關問題