我已经搜索过但我无法找到解决问题的好方法,希望有人能帮助我。 我有一些函数将c#变量写入偏移位置的缓冲区。我有一个类似下面的功能。这个WriteFloat函数有效,它可以正确获取所有字节。
public unsafe void WriteFloat(float v, byte[] m_Buffer,int m_Offset )
{
ValidateBufferSize(sizeof(float));
fixed ( byte* buf = m_Buffer )
*(float*)(buf + m_Offset) = v;
m_Offset += sizeof(float);
}
我还为每种类型提供了一个可以从缓冲区读回值的读取函数。偏移量是我们在上次读取后停止的位置。
public unsafe float ReadFloat( byte[] m_Buffer,int m_Offset)
{
fixed (byte* buf = m_Buffer)
{
float v = *((float*)(buf + m_Offset));
m_Offset += sizeof(float);
return v;
}
}
这是问题所在。 float是我目前唯一不支持的变量,因为我的ReadFloat函数总是返回错误的值。
例如:这是我们写入缓冲区后的缓冲区(注意:不要介意前4个字节)最后4个字节是短5.5f = 00 00 b0 40
08 00 01 01 00 00 b0 40
当我在该缓冲区上使用readFloat函数时,它总是返回0;
我做错了吗?
答案 0 :(得分:1)
以正确的方式行事
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
float input = 123.45F;
byte[] array = new byte[4];
WriteFloat(input, ref array, 0);
float output = ReadFloat(array, 0);
}
static public void WriteFloat(float v, ref byte[] m_Buffer, int m_Offset)
{
BitConverter.GetBytes(v).CopyTo(m_Buffer, m_Offset);
}
static public float ReadFloat(byte[] m_Buffer, int m_Offset)
{
return BitConverter.ToSingle(m_Buffer, m_Offset);
}
}
}