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

5
我正在尝试将以下两种方法转换为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个回答

5
在Java中,“>>>”是无符号右移操作符。如果它的值为负数,可以用“>>”代替,但是此时会对值进行符号扩展。然而,在这种情况下使用“>>”操作符是无害的,因为结果被缩减为单个字节的值(& 0x00FF)。
在Java中,bytesToInt方法中使用的掩码(& 0xFF000000等)是必要的,因为在Java中,字节是有符号值,即它们可以是正数或负数,并且将其转换为int可能会对负值进行符号扩展。然而,在C#中,字节只能是正数,因此不需要掩码。因此,bytesToInt方法可以简单地重写为:
return (((int)b0 << 24))    
  | (((int)b1 << 16))
  | (((int)b2 << 8))
  | ((int)b3);

1

您可以使用 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;
}

Eric,你的回答既正确又出色。感谢你的努力。 - TheDevOpsGuru
不客气。我喜欢让框架尽可能多地为我工作。 :) - Eric Olsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接