浮点数转换到16进制字符串

这几天一直在弄postgre的数据写入,特别是几何数据的写入。在几何数据的写入过程中,可以有多种

通过WKB,TEXT都是可以的。先觉得,通过Text建立会比较慢,因为要用到geometryfromtext,与把数据转换成文本再让数据库进行转换,不如自己进行转换成 WKB形式的

第一段的难点就是将double类型转换成十六进制字符串 ,就是将64bit转换成16进制字符串表示。首先学习了IEEE754标准,了解浮点函数的编码方式。

浮点数转换到16进制字符串插图
void
 TestDouble(
double
 value)
浮点数转换到16进制字符串插图1浮点数转换到16进制字符串插图2


{
浮点数转换到16进制字符串插图3    
int count=0;
浮点数转换到16进制字符串插图3    
string x;
浮点数转换到16进制字符串插图3    
if (value>0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3        x
+=0;                                      //判断符号
浮点数转换到16进制字符串插图6
    }

浮点数转换到16进制字符串插图3    
else
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3        x
+=1;
浮点数转换到16进制字符串插图3        value
=-value;
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    
while (2<=value)                                //获得小数点后值
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5
    {
浮点数转换到16进制字符串插图3        value
=value/2.0;
浮点数转换到16进制字符串插图3        count
++;
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    count
=count+1023;                              //将阶码变成二进制表示
浮点数转换到16进制字符串插图3
    bitset<11>code(count);
浮点数转换到16进制字符串插图3    x
+=code.to_string();                           //前半部分二进制表示
浮点数转换到16进制字符串插图3
    int digit=-1;
浮点数转换到16进制字符串插图3    value
-=1.0;
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
/**///将数值用二进制表示/////
浮点数转换到16进制字符串插图3    double posval=0.0;
浮点数转换到16进制字符串插图3    
double tempval=0.0;
浮点数转换到16进制字符串插图3    
while (value!=0&&digit>-54)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3        posval
=Power(2,digit);
浮点数转换到16进制字符串插图3        tempval
=valueposval;
浮点数转换到16进制字符串插图3        
if(tempval>0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5        
{
浮点数转换到16进制字符串插图3            x
+=1;
浮点数转换到16进制字符串插图3            value
=tempval;
浮点数转换到16进制字符串插图6        }

浮点数转换到16进制字符串插图3        
else if (tempval==0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5        
{
浮点数转换到16进制字符串插图3            x
+=1;
浮点数转换到16进制字符串插图3            
break;
浮点数转换到16进制字符串插图6        }

浮点数转换到16进制字符串插图3        
else
浮点数转换到16进制字符串插图3            x
+=0;
浮点数转换到16进制字符串插图3        
digit;    
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    
int size=64x.size();
浮点数转换到16进制字符串插图3    
if (size>0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3       
char* temp=new char[size];
浮点数转换到16进制字符串插图3       memset(temp,
0,size);
浮点数转换到16进制字符串插图3       x.append(temp,size);
浮点数转换到16进制字符串插图3       delete temp;
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    cout
<<binTohexstr(x)<<endl;
浮点数转换到16进制字符串插图7}


浮点数转换到16进制字符串插图
浮点数转换到16进制字符串插图

static
 
string
 binTohexstr(
string
 temp)
浮点数转换到16进制字符串插图1浮点数转换到16进制字符串插图2


{
浮点数转换到16进制字符串插图3    
string value=“”;
浮点数转换到16进制字符串插图3    
if (temp.size()%4!=0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3        
return NULL;
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    
while ((temp.size()4)>0)
浮点数转换到16进制字符串插图4浮点数转换到16进制字符串插图5    
{
浮点数转换到16进制字符串插图3        value
+=binTohex(temp.substr(0,4));
浮点数转换到16进制字符串插图3        temp
=temp.substr(4,temp.size()4);
浮点数转换到16进制字符串插图6    }

浮点数转换到16进制字符串插图3    value
+=binTohex(temp);
浮点数转换到16进制字符串插图3    
return value;
浮点数转换到16进制字符串插图7}


浮点数转换到16进制字符串插图
浮点数转换到16进制字符串插图

static
 
char
 binTohex(
string
 temp)
浮点数转换到16进制字符串插图1浮点数转换到16进制字符串插图2


{                
浮点数转换到16进制字符串插图3    
if(0000==temp)
浮点数转换到16进制字符串插图3        
return 0;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0001==temp)
浮点数转换到16进制字符串插图3        
return 1;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0010==temp)
浮点数转换到16进制字符串插图3        
return 2;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if (0011==temp)
浮点数转换到16进制字符串插图3        
return 3;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0100==temp)
浮点数转换到16进制字符串插图3        
return 4;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0101==temp)
浮点数转换到16进制字符串插图3        
return 5;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0110==temp)
浮点数转换到16进制字符串插图3        
return 6;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(0111==temp)
浮点数转换到16进制字符串插图3        
return 7;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1000==temp)
浮点数转换到16进制字符串插图3        
return 8;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1001==temp)
浮点数转换到16进制字符串插图3        
return 9;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1010==temp)
浮点数转换到16进制字符串插图3        
return A;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1011==temp)
浮点数转换到16进制字符串插图3        
return B;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1100==temp)
浮点数转换到16进制字符串插图3        
return C;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1101==temp)
浮点数转换到16进制字符串插图3        
return D;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1110==temp)
浮点数转换到16进制字符串插图3        
return E;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else if(1111==temp)
浮点数转换到16进制字符串插图3        
return F;
浮点数转换到16进制字符串插图3
浮点数转换到16进制字符串插图3    
else 
浮点数转换到16进制字符串插图3        
return G;
浮点数转换到16进制字符串插图7}

上面是整个转换到流程,先转换成二进制,难点在于理解double值得表示方式为value=(1+m)*2n其中2n表示2的n次方。首先求出2的阶码,double的阶吗有12位,就是2048次方,但是double还有表示小数后的值,所以要表示-1023~1024的值,就要进行转换。得到的值都是需要进行移位,3.5=(1+0.75)×2;所以阶吗就是1+1023=1024,就是10000000。另外double 的第一位是符号位,0是正,1是负。(1+m)中的M是大于0小于1的。这个M是value不断被2除得到大于1小于2的数字,又因为double里面的数都是默认加个1,所有得到m。

m再用小数表示,得到结果


demo Image, see caption

标签