将代码从C#转换为Java - 位操作,Int64到long

时间:2018-01-25 22:12:57

标签: java c# bit-manipulation

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

如果人们需要输入变量,我会尝试将缓冲区字节数组作为十六进制字符串,这样我就可以把它放了。 startIndex我使用的是26

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));

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,在.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清除。