2010-07-29 63 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