big-endian BinaryReader 在长时间读取时给出错误的值

big-endian BinaryReader gives wrong value when reading long

我目前正在开发套接字服务器。 客户端以 BigEdian 格式发送数据,所以我 决定使用 this 包。但是对于 Int64 它给了我一个不同的值

这是测试代码。它适用于 int32

long val = ((long)868324021119164);
byte[] longval = BitConverter.GetBytes((long)868324021119164);
Array.Reverse(longval);
using (MemoryStream stream = new MemoryStream(longval))
using (BeBinaryReader BeReader = new BeBinaryReader(stream))
{
   Console.WriteLine(BeReader.ReadInt64());
}

这是我的结果 8130168015229752764

我查看了 source code 并找到了这些功能。 我对不安全代码没有任何经验。所以我不知道他们是不是错了

public override long ReadInt64()
{
    FillBuffer(8);
    fixed (byte* p = buffer)
         return BigEndian.ReadInt64(p);
}


[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long ReadInt64(byte* p)
{
    int lo = ReadInt32(p);
    int hi = ReadInt32(p + 4);
    return (long)hi << 32 | (uint)lo;
}

我有一个windows 10 64位PC

谢谢

代码在这里:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long ReadInt64(byte* p)
{
    int lo = ReadInt32(p);
    int hi = ReadInt32(p + 4);
    return (long)hi << 32 | (uint)lo;
}

好像不太对。应该是:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long ReadInt64(byte* p)
{
    int hi = ReadInt32(p);
    int lo = ReadInt32(p + 4);
    return (long)hi << 32 | (uint)lo;
}

big endian中,高32位在前。代码将其反转。你应该提交错误报告,也许建议作者编写一些单元测试:)