2010-07-29 62 views
4

在Java中,我可以很容易地投下數字節,例如:PHP轉換爲字節,

System.err.println((byte) 13020); 

結果將是

-36 

現在我怎麼能實現在同一PHP?

回答

2

也許做一個模256表達式(如果無符號)或模256和負128

$val = ($val % 256) - 128 

這個工作,如果你只想要一個值。如果你想要一個真正的一個字節,也許pack()函數將在這裏幫助。

編輯:對,0將是128,所以也許這個解決方案將做的工作:

$val = (($val+128) % 256) - 128 
+0

so ... 0將是-128?奇。 – mvds 2010-07-29 10:58:21

+0

(13020%256) - 128將不會退回一個-36, 我得到-128而不是 – shay 2010-07-29 11:00:37

+1

@shay:你應該至少得到'92'這是'-36'模'128' – 2010-07-29 11:01:45

0

你不能。 PHP沒有像Java那樣的數據類型byte

+0

不要告訴我你不能在PHP中這樣做。它可能並不簡單,但它絕對是可行的。 – 2010-07-29 10:53:14

+0

@Peter:你如何轉換爲不存在的數據類型? – 2010-07-29 10:56:11

+3

他並不關心使用的實際數據類型。他希望在java – gnud 2010-07-29 10:59:46

6
echo ($a&0x7f) + ($a&0x80?-128:0); 

編輯這種模仿我應該實際發生的符號的8位值。當MSB(位7)爲零時,我們只有這7位的值。 MSB設置爲1時,我們從-128開始(即1000000b == -128d)。

你也可以利用PHP使用內部整數值的事實:

$intsize = 64; // at least, here it is... 
echo ($a<<($intsize-8))/(1<<($intsize-8)); 

所以你卻將字節爲PHP看到它的INT的MSB位置的最高位,即你加56個零位在右邊。該部門「剝離」這些位,同時保持值的符號。

+1

+1不錯,但如果你解釋它是如何工作的話會更好。 – 2010-07-29 11:02:01

+1

更好?包括一些更有趣的魔法。 – mvds 2010-07-29 11:09:47

+0

工作很棒:)謝謝 – shay 2010-07-29 11:15:47