久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C# 四個字節(jié)十六進制數(shù)和單精度浮點數(shù)之間的相互轉化

 newencn 2011-11-03

即是所謂的IEEE754標準,這也是大多數(shù)硬件存儲浮點數(shù)的標準,。單精度浮點數(shù)占4個字節(jié),表示范圍為:在負數(shù)的時候是從 -3.402823E38 到 -1.401298E-45,,而在正數(shù)的時候是從 1.401298E-45 到 3.402823E38 ,。

在C#中的轉換函數(shù)為:

1,由四個字節(jié)的十六機制數(shù)組轉浮點數(shù):

byte[] bytes = new byte[4];

BitConverter.ToSingle(bytes, 0);

2,由浮點數(shù)轉數(shù)組:

byte[] bytes = BitConverter.GetBytes(floatValue);

這種轉換方法經(jīng)常用于串口通訊中,表示范圍足夠各種傳感器數(shù)值傳輸及工控場合,,將要發(fā)送的浮點數(shù)據(jù)轉換為4個字節(jié)的十六機制數(shù),,然后由串口發(fā)出,在接收端再將其轉換為浮點數(shù),。

單片機或非.net環(huán)境下使用轉換程序則不能調用BitConverter類,!

提供以下代碼以供轉換:

未修改過的如下:可以在C#中直接調用而不用庫函數(shù)

public static float ToFloat(byte[] data)
{
float a = 0;
byte i;
byte[] x = data;
unsafe
{
void* pf;
fixed (byte* px = x)
{
pf = &a;
for (i = 0; i < data.Length; i++)
{
*((byte*)pf + i) = *(px + i);
}
}
}


return a;
}

public static byte[] ToByte(float data)
{
unsafe
{
byte* pdata = (byte*)&data;
byte[] byteArray = new byte[sizeof(float)];
for (int i = 0; i < sizeof(float); ++i)
byteArray[i] = *pdata++;

return byteArray;
}
}

如果對工程進行直接編譯會報出一下錯誤:這是因為C#默認不提供指針支持,只有在不安全代碼的形式下才可以用指針,。

錯誤 1 不安全代碼只會在使用 /unsafe 編譯的情況下出現(xiàn) E:\Visual Studio 2008\Projects\TEST\testOfFloatConsolt\testOfFloatConsolt\Program.cs 26 13 testOfFloatConsolt
這時選擇VS的菜單欄中的項目->"Project"屬性->生成->常規(guī)->允許不安全代碼 勾選即可

單片機串口通訊浮點轉換函數(shù)

我在AVR串口通信協(xié)議中用到了這部分,,直接將單片機的運算結果(浮點類型)轉換為(字節(jié)類型)嵌入串口通信協(xié)議中,,上傳至上位機,。

下面為符合IEEE754標準將浮點數(shù)轉換為四個字節(jié)的數(shù)組的函數(shù)源代碼:已經(jīng)用于mega16單片機的串口通信中。

WinAVR-20090313測試通過:

void FloatToByte(float floatNum,unsigned char* byteArry)
{
char* pchar=(char*)&floatNum;
for(int i=0;i<sizeof(float);i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}

下面為符合IEEE754標準的由四個字節(jié)型數(shù)組轉化為相應的浮點數(shù)

WinAVR-20090313測試通過:

float ByteToFloat(unsigned char* byteArry)
{
return *((float*)byteArry);
}

調用測試方法:其中USART_Transmit();為向串口發(fā)送的函數(shù),。

unsigned char floatToByte[4];
FloatToByte(12.15,floatToByte);
float a=ByteToFloat(floatToByte);
FloatToByte(a,floatToByte);
USART_Transmit(floatToByte[0]);
USART_Transmit(floatToByte[1]);
USART_Transmit(floatToByte[2]);
USART_Transmit(floatToByte[3]);

在上位機用串口進行讀取時調用

BitConverter.ToSingle(bytes, 0);

就會轉換成12.15,,測試方法可以隨著需求改變。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多