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位在前。代码将其反转。你应该提交错误报告,也许建议作者编写一些单元测试:)
我目前正在开发套接字服务器。 客户端以 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位在前。代码将其反转。你应该提交错误报告,也许建议作者编写一些单元测试:)