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

时间:2011-08-03 02:26:06

标签: c# java bit-manipulation

我试图将以下两种方法转换为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;
}

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

“&gt;&gt;&gt;”是Java中的无符号右移运算符。它可以替换为“&gt;&gt;”,但如果值为负,则对其进行符号扩展。但是,在这种情况下,使用“&gt;&gt;”运算符是无害的,因为结果减少为值的单个字节(& 0x00FF)。

在Java中需要使用bytesToInt(& 0xFF000000等)中的掩码,因为在Java中,字节是有符号值,也就是说,它们可以是正数或负数,转换为int可以sign-extend一个负值。但是,在C#中,字节只能是正数,因此不需要屏蔽。因此,bytesToInt方法可以简单地重写为:

return (((int)b0 << 24))    
  | (((int)b1 << 16))
  | (((int)b2 << 8))
  | ((int)b3);

答案 1 :(得分:0)

您可以使用BitConverter类在基本数据类型和字节数组之间进行转换。

重写bytesToInt()方法如下所示:

public static int BytesToIntUsingBitConverter(byte b0, byte b1, byte b2, byte b3)
{
  var byteArray = BitConverter.IsLittleEndian ? new byte[] { b3, b2, b1, b0 } : new byte[] { b0, b1, b2, b3 };

  return BitConverter.ToInt32(byteArray, 0);
}

重写charToBytes()方法如下所示:

public static byte[] CharToBytesUsingBitConverter(char c)
{
  byte[] byteArray = BitConverter.GetBytes(c);
  return BitConverter.IsLittleEndian ? new byte[] { byteArray[1], byteArray[0] } : byteArray;
}