这个java字节转换是如何工作的 int-port=data[4]
int和其他整数原语(java)使用2的补码表示法()存储。这意味着如果你的数字是正数,那么它将以31位表示,如果是负数,那么你必须从2^32中找到“completemet”。 在接受无符号变量的语言中,到二进制的转换可能是您所期望的,即32位的正常基转换。在此之前,如果您不熟悉逻辑运算符,可能需要阅读。 对于您的情况,存储一个4字节数组(32位是int的长度),并执行以下操作:这个java字节转换是如何工作的 int-port=data[4],java,Java,int和其他整数原语(java)使用2的补码表示法()存储。这意味着如果你的数字是正数,那么它将以31位表示,如果是负数,那么你必须从2^32中找到“completemet”。 在接受无符号变量的语言中,到二进制的转换可能是您所期望的,即32位的正常基转换。在此之前,如果您不熟悉逻辑运算符,可能需要阅读。 对于您的情况,存储一个4字节数组(32位是int的长度),并执行以下操作: port=data[4]int和其他整数原语(java)使用2的补码表示法()存储。这意味着,如果你的数字是正数,将
port=data[4]int和其他整数原语(java)使用2的补码表示法()存储。这意味着,如果你的数字是正数,将以31位表示,如果是负数,则必须从2^32中找到“completemet”。
在接受无符号变量的语言中,到二进制的转换可能是您所期望的,即32位的正常基转换。在此之前,如果您不熟悉逻辑运算符,可能需要阅读。
对于您的情况,存储一个4字节数组(32位是int的长度),并执行以下操作:
port=data[4]我错误地教导8个十六进制不是整数,这是错误的,它的编写方式是正确的
int-port=data[4]我错误地教导8个十六进制不是整数,这是错误的,它的编写方式是正确的
int-port=data[4]第一行中的括号与其他行中的模式不匹配……是的,第一行的计算结果为data[4]
,这可能不是正确的,但我也怀疑索引-数组应该从0开始(尽管上下文可能会使其合理)。如果您试图从该代码中学习,请不要这样做。第一行中的括号与其他行中的模式不匹配…是的,第一行的计算结果为数据[4]
,这可能不是正确的做法,但我也怀疑索引-数组应该从0开始(尽管这种情况可能会使其合理化)。如果您试图从该代码中学习,请不要。在使用Integer.toBinaryString找出您在逻辑和上执行的截断掩码后:0xFF000000
将转换为0xF000
,0x00FF0000
转换为0x0F00
,0x0000FF00
转换为0x00F0
,0x000000FF
到0x000F
。现在使用这些数字执行上面的逻辑谢谢,因此通过这段代码,最后一行代码应该用数据[1]覆盖数据[4]的内容,使其port=0x0(数据[3])(数据[2])(数据[1])?还有为什么需要以十六进制传递值,如果我更改“port”|(数据[1])行,会有任何区别吗&0x000000FF)“到”端口|(数据[1]&255)”考虑到JVM是Big-Endian且存在无法理解的长截短错误,我将提供一个更完整的解决方案。在使用Integer.toBinaryString找出那些是您在逻辑和上执行的截短掩码之后:0xFF000000
将转换为0xF000
,0x00FF0000
转换为0x0F00
,0x0000FF00
到0x00F0
,0x000000FF
到0x000F
。现在使用这些数字执行上面的逻辑谢谢,因此通过此代码,最后一行代码应该用数据[1]覆盖数据[4]的内容,使其端口=0x0(数据[3])(数据[2])(数据[1])?还有,为什么必须以十六进制传递值,如果我将“port |(data[1]&0x000000FF)”行更改为“port |(data[1]&255)”,会有什么不同吗?考虑到JVM是Big-Endian,并且存在无法解释的长截断错误,我将提供一个更完整的解决方案。
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);