让我先从问题开始:
def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = {
((byte4 << 0)) | ((byte3 << 8)) | ((byte2 << 16)) | ((byte1 << 24))
}
这里的目标非常简单。给定4个字节,将它们打包到Int
。
上面的代码不起作用,因为看起来移位运算符会尝试保留符号。例如,这个:
word(0xFA.toByte, 0xFB.toByte, 0xFC.toByte, 0xFD.toByte).formatted("%02X")
在我预期FFFFFFFD
时生成FAFBFCFD
。
缩小问题:
0xFE.toByte << 8
以二进制补码生成-2,而不是0xFE00。
如果没有签名问题,我怎样才能进行轮班?
答案 0 :(得分:4)
使用0xFF
的字节来撤消转移前符号扩展的影响:
((byte4 & 0xFF) << 0) | ((byte3 & 0xFF) << 8) | ...
答案 1 :(得分:4)
您的怀疑是正确的,@ user2357112会回答您的问题。
现在,您可以使用ByteBuffer
作为一个干净的替代品:
def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int =
ByteBuffer.wrap(Array(byte1, byte2, byte3, byte4)).getInt