我目前正在使用套接字服务器。 客户端以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
由于
答案 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位数首先出现。代码反转了这一点。您应该提交错误报告,并建议作者编写一些单元测试:)