C/C++ float轉換二進制

        昨天晚上朋友讓幫忙寫個程序,C++中將float轉換成二進制流輸出,剛開始一點點的轉啊,哎,直接哭了。一晚上也沒搞定。

        回去查了點資料,又找同學商量了一下,找到個相對好的點的方法,驗證了幾個,結果是對的,但也不保證其他的也對,貼出來,大家交流一下

步驟:

1、首先取float的地址,強制轉換成char*類型後賦值給一個char *的指針cp,然後對cp開始的四個字節按照char類型轉換成二進制字符串。

2、轉換結束之後,對計算機進行高低字節序判斷,若是高字節序,則對得到的二進制字符串進行逆序。

==》這一步有問題,字節序判斷後的調整不應該是對整個二進制字符串進行逆序,而是對四個字節進行順序調整,在此謝謝 Azrael_cc 兄,代碼直接調整了一下,沒驗證結果

代碼:

#include <iostream>
#include <string>
using namespace std;
string c2b(char *cp, int n);
int isBigEndian();
int main()
{
	float fval = (float)4.25;
	char *cp = (char *)&fval;
	cout<<isBigEndian()<<endl;
	string ret;
	ret = c2b(cp, 4);
	if(!isBigEndian())//如果是高字節序,則將字符串逆序
	{
		for(int i = 3; i > 0; i--)
		{
			for(int j = 0; j <8; j++)
				cout<<ret[8*i + j];
		}
		return 0;
	}

	//此處的ret爲處理結束後的結果
	cout<<ret<<endl;
	return 0;
}
/**
*@fun 將字符串轉換成二進制流輸出
*
**/
string c2b(char *cp, int n)
{
	string tmpStr = "";
	for(int i = 0; i < n; i++)
    {
		char ch = cp[i];
		char shift = ch >> 1;
		for(int j = 0; j < 8; j++)
		{
			if(ch == (shift << 1))
				tmpStr += "0";
			else if(ch != (shift << 1))
				tmpStr += "1";
			ch = shift;
			shift = shift >> 1;
		}
    }
	return tmpStr;
}
/**
*@fun 判斷計算機高低字節序
*
**/
int isBigEndian()
{
    unsigned short t = 1;
    unsigned char *m = (unsigned char*)&t;
    return m[1];
}

運行結果



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章