读取从Java编写的C#中的字节数组

时间:2011-05-10 14:56:35

标签: c# java bytearray endianness

我正在尝试从C#编写一个Integer并从Java中读取它。两种语言中的整数都是4个字节。但是当我从C#写入时,整数1写入以下字节 1000.含义第一个字节为1,其余为0。

但在Java中,同样的事情被写为0001.Maing前3个字节为0,最后一个为1。

是否有一种简单的方法可以在这些语言中进行读写,而不是每4字节手动反转一次? Java的代码

ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.putInt(1);

for(byte b: buffer.array()){
      System.out.print(b);
}

C#的代码

MemoryStream ms = new MemoryStream();
using(BinaryWriter writer = new BinaryWriter(ms))
{
    writer.Write((int)1);

}
foreach(byte b in ms.ToArray()){
    Console.Write(b);
}

2 个答案:

答案 0 :(得分:5)

您可以在任意一侧切换endianness以使其兼容。

例如在java端,您可以将其设置为使用ByteOrder.LITTLE_ENDIAN(默认为BIG_ENDIAN)

在您的情况下,您可以使用ByteBuffer.order()来设置订单。

buffer.order(ByteOrder.LITTLE_ENDIAN);

或者您可以选择在C#端进行更改,在这种情况下,您必须使Big-Endian与java兼容。

答案 1 :(得分:2)

由于这篇文章指出了http://kirkwylie.blogspot.com/2008/11/c-binarywriter-is-little-endian-because.html C#BinaryWriter只支持小端,所以你必须使用订单方法http://download.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#order%28java.nio.ByteOrder%29

在java站点上配置它。