我正在尝试将此代码段从C#转换为Java。 C#代码段正确返回值3259945,Java代码错误返回-16855。我对位操作完全没用,甚至不知道从哪里开始。有人可以帮忙吗?

如果人们需要输入变量,我将尝试以十六进制字符串的形式获取缓冲区字节数组,这样我就可以提出它了。我正在使用的startIndex26

C#代码段:

Int64 mantissa = ((Int64)(buffer[startIndex] & 0x7F) << (8 * 2))
                        | ((Int64)buffer[startIndex + 3] << (8 * 1))
                        | ((Int64)buffer[startIndex + 2] << (8 * 0));


Java代码段:

long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
                | ((long)buffer[startIndex + 3] << (8 * 1))
                | ((long)buffer[startIndex + 2] << (8 * 0));

最佳答案

如注释中所述,.NET中的字节是无符号的(0到255),而Java中的字节是无符号的(-128到127)。要对其进行规范化,您需要使用& 0xFF掩码。

long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
            | ((long)(buffer[startIndex + 3] & 0xFF) << (8 * 1))
            | ((long)(buffer[startIndex + 2] & 0xFF) << (8 * 0));


在第一种情况下,您不需要此掩码,因为符号位已被0x7F清除。

10-07 14:57