让我从问题开始:

  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。

如何在没有信号问题的情况下进行换班?

最佳答案

与带有0xFF的字节一起撤消移位前符号扩展的影响:

((byte4 & 0xFF) << 0) | ((byte3 & 0xFF) << 8) | ...

09-04 13:19