十六进制转double
生活随笔
收集整理的這篇文章主要介紹了
十六进制转double
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要明白如何將十六進制轉換為float或double,需要了解浮點數的二進制存儲和轉換方式。float和double在存儲方式上都遵從IEEE的規范,且float遵從IEEE R32.24,而double遵從R64.53。具體轉換規則可以參考http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html。
按照轉換規則,寫出HexToFloat和HexToDouble代碼如下(buf指向的Hex已經進行高低地址轉換):
//將字節中pos位置開始的len位的二進制數轉換為整數 unsigned int getbitu(const unsigned char *buff, int pos, int len) {unsigned int bits=0;int i;for (i=pos;i<pos+len;i++){bits=(bits<<1)+((buff[i/8]>>(7-i%8))&1u); //從高位到低位逐位計算}return bits; }float HexToFloat(const unsigned char *buf) {float value = 0.0;unsigned int i = 0;unsigned int num, temp;int num2;bool flags1 = true;num = getbitu(buf, i, 1); //標志位i = i + 1; //指數部分,float型數據其規定偏移量為127,階碼有正有負,對于8位二進制,則其表示范圍為-128-127num2 = getbitu(buf, i, 8) - 127;i = i + 8;while(1){if(flags1){value += 1 * pow(2, num2);num2--;flags1 = false;}temp = getbitu(buf, i, 1);i += 1;value += temp * pow(2, num2);num2--;if(i == 32)break;}if(num == 1)value *= -1;return value; }double HexToDouble(const unsigned char* buf) {double value = 0;unsigned int i = 0;unsigned int num,temp;int num2;bool flags1 = true;num = getbitu(buf,i,1); //標志位 i += 1; //double型規定偏移量為1023,其表示范圍為-1024-1023num2 = getbitu(buf,i,11) - 1023; i += 11; while(1){if(flags1){flags1 = false;value += 1 * pow(2,num2); num2--;}temp = getbitu(buf,i,1); i += 1;value += temp * pow(2,num2); num2--;if(i == 64)break;}if(num == 1)value *= -1;return value; }總結
以上是生活随笔為你收集整理的十六进制转double的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: break与continue的的用法以及
- 下一篇: 四元数和欧拉角的相互转换