2015-07-22 163 views
2

我已經搜索,但我找不到我的問題很好的答案我希望有人能幫助我。 我有一些函數將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;

有什麼我做錯了嗎?

回答

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); 

     } 
    } 
} 
​