读长

时间:2016-10-12 13:33:25

标签: c# memorystream endianness

我目前正在使用套接字服务器。 客户端以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

由于

1 个答案:

答案 0 :(得分:1)

这里的代码:

[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位数首先出现。代码反转了这一点。您应该提交错误报告,并建议作者编写一些单元测试:)