C# - 从Java的DataOutputStream中读取一篇文章

时间:2014-12-28 23:06:20

标签: java c#

我正在使用java编程语言中的DataOutputStream#WriteLong方法将一个long写入一个流,我需要能够使用C#中的BinaryReader类从C#中读取它为了读取数据,BinaryReader连接到使用TcpClient套接字的NetworkStream

java DataInputStream#ReadLong方法用于读取Java中DataOutputStream发送的long值,但是我正在尝试使用BinaryReader类来读取此值。

这是我在C#中读取长变量的方法

public static long ReadLong()
{
    return binaryReader.ReadInt64();
}

然而,这导致了不一致,例如,我通过Java发送了两个long:

-8328681194717166436 || -5321661121193135183

当我在C#上阅读它时,我收到了以下结果:

 -7186504045004821876||-5642088012899080778

我可以多次重现这一点,因为我对应用程序感到满意。

1 个答案:

答案 0 :(得分:4)

正如您在java文档中所读到的那样,WriteLong首先写出输出"高字节",这也称为Big Endian。同时,.NET BinaryReader将数据读取为Little Endian。我们需要一些可以反转字节的东西:

public class BigEndianBinaryReader : BinaryReader
{
    private byte[] a16 = new byte[2];
    private byte[] a32 = new byte[4];
    private byte[] a64 = new byte[8];

    public BigEndianBinaryReader(Stream stream) : base(stream) { }

    public override int ReadInt32()
    {
        a32 = base.ReadBytes(4);
        Array.Reverse(a32);
        return BitConverter.ToInt32(a32, 0);
    }

    public Int16 ReadInt16BigEndian()
    {
        a16 = base.ReadBytes(2);
        Array.Reverse(a16);
        return BitConverter.ToInt16(a16, 0);
    }

    public Int64 ReadInt64BigEndian()
    {
        a64 = base.ReadBytes(8);
        Array.Reverse(a64);
        return BitConverter.ToInt64(a64, 0);
    }

    public UInt32 ReadUInt32BigEndian()
    {
        a32 = base.ReadBytes(4);
        Array.Reverse(a32);
        return BitConverter.ToUInt32(a32, 0);
    }
}