这个java字节转换是如何工作的

时间:2015-10-25 13:13:46

标签: java

int port = data[4] << (24 & 0xFF000000);//data[]=byte array containing int value
port = port | ((data[3] << 16) & 0x00FF0000);

port = port | ((data[2] << 8) & 0x0000FF00);

port = port | (data[1] & 0x000000FF);

我是位新人。有人可以解释这个字节转换是如何工作的,结果会是什么。

2 个答案:

答案 0 :(得分:0)

int和其他整数基元(在java中)使用2的补码表示(link here)存储。这意味着如果你的数字将在31位上表示为正常如果是积极的,你必须从2 ^ 32找到&#34;的补充,如果是否定的话。 在接受无符号变量的语言中,转换为二进制是您可能期望的转换,即32位的正常基本转换。在此之前,如果您不熟悉逻辑运算符,则可能需要阅读this。 对于您的情况,您存储一个4字节数组(32位是int的长度)并执行以下操作:

  1. port = data[4] << (24 & 0xF000):port等于数组中的最后一个字节,因为24 = 0x0018 (16 + 8)为hexa,&表示逻辑,因此24 & 0xF000 = 0,现在为data[4] << 0是第一个字节的数据[4](移位位0次)port = Ox000(data[4])
  2. 接下来我们有port = port | ((data[3] << 16) & 0x0F00),它再次没有改变,只有位置16的一个字节带有data[3](第二个字节)。这是因为向左移16位而不是与0x0F00进行逻辑按位AND将使这些位保持在F(1位)的位置。然后按位|使用port只会添加1,你从我们刚刚讨论的数字位置得到0。 port = 0x0(data[3])0(data[4])。 编辑:0x00FF0000实际上是0x0F00,因为它将被解释为int而不是long(64位))。我不建议你使用这种类型的代码,看到长截断并且因为endiannes(机器解释数据的方式,字节的顺序)是很棘手的。 Java是为了平台独立而创建的,在这种情况下,JVM可能会弄清楚(我也必须自己记录)并拯救你,但是在另一种低级语言中它并不是那样的。 与其他两个相同,并找出这些位是如何玩的

答案 1 :(得分:0)

我错误地教导了8个十六进制小数不是整数,这是错误的,它的写法是正确的。

  1. int port = data[4] << (24 & 0xFF000000)此处24将转换为0x0000018 & 0xFF000000 = 0,因此data[4]将保留在最后一个位置。
  2. port = port | ((data[3] << 16) & 0x00FF0000)此处data[3]将移位2个字节,然后0x00(data[3])0000 & 0x00FF0000等于 0x00(data[3])0000并在我们使用原始端口创建|之后 port = 0x00(data[3])00(data[4])

  3. port = port | ((data[2] << 8) & 0x0000FF00)此处data[2]将移动1个字节,我们将获得0x0000(data[2])00 = 0x0000(data[2])00 & 0x0000FF00并将其附加到port = 0x00(data[3])(data[2])(data[4])

  4. port = port | (data[1] & 0x000000FF)这里结果为port = 0x00(data[3])(data[2])(data[1] | data[4])。可能这不是故意的,因为你混淆了这些数字,很可能你想首先改变24个字节data[4]。如果由于2的补码表示而导致该数字为负数,请不要感到困惑。