将Java方法转换为C#:使用位移运算符将字节转换为整数

The*_*uru 5 c# java bit-manipulation

我试图将以下2种方法转换为c#,而.net编译器却没有抱怨。坦率地说,我只是不了解这两种方法在后台如何真正起作用。因此,这里的答案和解释将很棒。

public static int bytesToInt(byte b0, byte b1, byte b2, byte b3)
{
        return (((int)b0 << 24) & 0xFF000000)
            | (((int)b1 << 16) & 0x00FF0000)
            | (((int)b2 << 8) & 0x0000FF00)
            | ((int)b3 & 0x000000FF);
}

public static byte[] charToBytes(char c)
{
    byte[] result = new byte[2];

    result[0] = (byte) ((c >>> 8) & 0x00FF);
    result[1] = (byte) ((c >>> 0) & 0x00FF);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法特别令人困惑,因为使用的移位运算符与第一种方法不同。

在此先感谢您的帮助。

Pet*_* O. 5

“ >>>”是Java中的无符号右移运算符。可以用“ >>”代替,但是,如果该值是负数,则将其符号扩展。但是,在这种情况下,使用“ >>”运算符是无害的,因为结果减小为值(& 0x00FF)的单个字节。

& 0xFF000000在Java中,bytesToInt(等等)中使用的掩码是必需的,因为在Java中,字节是带符号的值,即,它们可以是正值或负值,并且转换为int可以对负值进行符号扩展。但是,在C#中,字节只能是正数,因此不需要屏蔽。因此,bytesToInt方法可以简单地重写为:

return (((int)b0 << 24))    
  | (((int)b1 << 16))
  | (((int)b2 << 8))
  | ((int)b3);
Run Code Online (Sandbox Code Playgroud)