2011-06-02 39 views
0

文本的字節數基本上,我需要端口這段代碼到PHP交換在PHP

for (i = 0; i < 128/4; i++) 
    data32[i] = bswap_32(data32[i]); 

但是,有PHP中沒有BSWAP功能。

會有人還跟我提供的東西,可以解決這個問題?

+0

什麼是'bswap_32'? 「文本」在哪裏? – 2011-06-02 22:04:15

+0

AFAIK,這是http://www.ee.surrey.ac.uk/CVSSP/Ravl/RavlDoc/share/doc/RAVL/Auto/Basic/Class/RavlN.bswap_32Obconst_int_AmpCb.html。至於文字,這是data32 [I] – dikidera 2011-06-02 22:05:06

+0

嗯,是的,我想我是假設'char',而不是'uint32_t'(大概)。 – 2011-06-02 22:06:05

回答

1

這應該這樣做(未經測試):

function bswap_32($j) 
{ 
    return (($j & 255) << 24) | (($j & 0xff00) << 8) | 
      (($j & 0xff0000) >> 8) | (($j & 0xff000000) >> 24); 
} 

或者,如果有一個符號擴展的問題,這應該解決它:

function bswap_32($j) 
{ 
    return (($j & 255) << 24) | (($j & 0xff00) << 8) | 
      (($j & 0xff0000) >> 8) | (255 & (($j & 0xff000000) >> 24)); 
} 
+0

小心符號擴展... – 2011-06-02 22:10:23

+0

@Oli的:我不認爲有什麼問題,但是,爲了以防萬一,從來修改的建議。 – wallyk 2011-06-02 22:12:05

+0

如果OP的平臺上的整數類型是32位,那麼肯定會有問題(除非OP的輸入值*從不*具有msb設置)。 – 2011-06-02 22:13:16

1

這聽起來像bswap_32被交換的endianness您32位數量。

我可以給你一些代碼,但我不想做別人的工作,爲他們,所以我會解釋的原則,而不是:

可以實現與位移和口罩(所以例如,您需要屏蔽掉最低8位,並將它們移到結果的最高8位位置)。

移可以與<<>>運營商來完成。可以用&運算符完成掩蔽。有關更多詳細信息,請參閱PHP manual page on operators