昨天晚上朋友讓幫忙寫個程序,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];
}
運行結果