使用iEEE 754从字符数组中恢复双倍值



所以我试图以4字节为增量从STL文件中读取数据。每个4字节的数字对应于x、y或z坐标的值。就我而言,这个数字并不需要非常精确。将值存储为double就可以了。但是,要读取4字节的数字,我必须首先将其存储在char[4]中。

例如,如果我尝试读取数字"2",我会将char[4]设置为看起来像0 0 0 64

类似地,数字0.314286看起来像15-22-9662

查看此链接后http://www.h-schmidt.net/FloatConverter/IEEE754.html我确定这些数字对应于IEEE754的二进制表示。在这种格式中,幅度仍然是我想要的数字(例如,我想要的数值是2或0.314286),但我无法让我的程序正确显示这些值。

例如:0 0 0 64=000000000000000001000000=IEEE754中的2注意:这与上面链接中的网站转换器略有不同,因为我认为endianness可能不同,但值仍然正确。

如何将4个字节的char[4]转换为它所包含的实际双值?也许这个问题比我想象的要容易得多,但我似乎很难确定价值。

我在这个网站上阅读了IEEE 754http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html但我不确定该如何处理这个问题。

谢谢你阅读这个问题,我是这个社区的新手,但我很感激我能找到的任何方向!

下面是一个代码示例,说明如何从存储在fname中的名为的文件中读取数据。

ifstream myFile(fname.c_str(), ios::in | ios::binary);
char triData[4] = "";
myFile.read(triData, 4);

输入文件是二进制STL文件。因此,查看文件对我们来说意义不大。

Created by stlwrite.m 08-Oct-2014 14:15:16                                        nS·¾!©’½­Rn¿ê ¾    éçr¿ê ¾œ•Ÿ½_q¿½ä¨¾    _q¿  nS·¾!©’=­Rn¿ê ¾    éçr¿½ä¨¾    _q¿ê ¾œ•Ÿ=_q¿  £¥`¾£¥`¾^s¿ê ¾ê ¾Ly¿ê ¾Ùd“¾_q¿Ùd“¾ê ¾_q¿  ¹œe¾™½¿x¿ê ¾ê ¾Ly¿Ùd“¾ê ¾_q¿ê ¾    }0|¿  ©œe¾™½¿x¿ê ¾    }0|¿Ùd“¾ê ¾_q¿ê ¾œ•Ÿ½_q¿  ¢œe¾;™½¿x¿ê ¾    }0|¿ê ¾œ•Ÿ½_q¿ê ¾    éçr¿  ¢œe¾;™=¿x¿ê ¾    éçr¿ê ¾œ•Ÿ=_q¿ê ¾    }0|¿  ©œe¾™=¿x¿ê ¾    }0|¿ê ¾œ•Ÿ=_q¿Ùd“¾ê >_q¿  ¹œe¾™=¿x¿ê ¾    }0|¿Ùd“¾ê >_q¿ê ¾ê >Ly¿  £¥`¾£¥`>^s¿ê ¾ê >Ly¿Ùd“¾ê >_q¿ê ¾Ùd“>_q¿  !©’½nS·¾­Rn¿    ê ¾éçr¿    ½ä¨¾_q¿œ•Ÿ½ê ¾_q¿  ;™½¢œe¾¿x¿    ê ¾éçr¿œ•Ÿ½ê ¾_q¿    ê ¾}0|¿  ™½©œe¾¿x¿    ê ¾}0|¿œ•Ÿ½ê ¾_q¿ê ¾Ùd“¾_q¿  ™½¹œe¾¿x¿    ê ¾}0|¿ê ¾Ùd“¾_q¿ê ¾ê ¾Ly¿  4œ½4œ½ž~¿ê ¾ê ¾Ly¿ê ¾    }0|¿    ê ¾}0|¿  fœ½fœ½ž~¿    ê ¾}0|¿ê ¾    }0|¿        ¯H¿  fœ½4œ=ž~¿ê ¾    }0|¿ê ¾ê >Ly¿        ¯H¿  4œ½fœ=ž~¿        ¯H¿ê ¾ê >Ly¿    ê >}0|¿  ™½¹œe>¿x¿ê ¾ê >Ly¿ê ¾Ùd“>_q¿    ê >}0|¿  ™½©œe>¿x¿    ê >}0|¿ê ¾Ùd“>_q¿œ•Ÿ½ê >_q¿  ;™½¢œe>¿x¿    ê >}0|¿œ•Ÿ½ê >_q¿    ê >éçr¿  !©’½nS·>­Rn¿    ê >éçr¿œ•Ÿ½ê >_q¿    ½ä¨>_q¿  !©’=nS·¾­Rn¿    ê ¾éçr¿œ•Ÿ=ê ¾_q¿    ½ä¨¾_q¿  ;™=¢œe¾¿x¿    ê ¾éçr¿    ê ¾}0|¿œ•Ÿ=ê ¾_q¿  ™=¯œe¾¿x¿œ•Ÿ=ê ¾_q¿    ê ¾}0|¿ê >ê ¾Ly¿  +™=¸œe¾¿x¿œ•Ÿ=ê ¾_q¿ê >ê ¾Ly¿ê >Ùd“¾_q¿  4œ=fœ½ž~¿    ê ¾}0|¿        ¯H¿ê >ê ¾Ly¿  fœ=4œ½ž~¿ê >ê ¾Ly¿        ¯H¿ê >    }0|¿  fœ=fœ=ž~¿        ¯H¿    ê >}0|¿ê >    }0|¿  4œ=4œ=ž~¿ê >    }0|¿    ê >}0|¿ê >ê >Ly¿  ™=£œe>¿x¿    ê >}0|¿    ê >éçr¿ê >ê >Ly¿  ;™=½œe>¿x¿ê >ê >Ly¿    ê >éçr¿œ•Ÿ=ê >_q¿  +™=¸œe>¿x¿ê >ê >Ly¿œ•Ÿ=ê >_q¿ê >Ùd“>_q¿  !©’=nS·>­Rn¿    ê >éçr¿    ½ä¨>_q¿œ•Ÿ=ê >_q¿  £¥`>£¥`¾^s¿ê >ê ¾Ly¿Ùd“>ê ¾_q¿ê >Ùd“¾_q¿  ¹œe>™½¿x¿ê >ê ¾Ly¿ê >    }0|¿Ùd“>ê ¾_q¿  £œe>,™½¿x¿Ùd“>ê ¾_q¿ê >    }0|¿ê >    éçr¿  Ïœe>:™½¿x¿Ùd“>ê ¾_q¿ê >    éçr¿ê >œ•Ÿ½_q¿  £œe>™=¿x¿ê >    }0|¿ê >ê >Ly¿ê >    éçr¿  ¹œe>3™=¿x¿ê >    éçr¿ê >ê >Ly¿Ùd“>ê >_q¿  Ïœe>:™=¿x¿ê >    éçr¿Ùd“>ê >_q¿ê >œ•Ÿ=_q¿  £¥`>£¥`>^s¿ê >ê >Ly¿ê >Ùd“>_q¿Ùd“>ê >_q¿  nS·>!©’½­Rn¿ê >    éçr¿½ä¨>    _q¿ê >œ•Ÿ½_q¿  nS·>!©’=­Rn¿ê >    éçr¿ê >œ•Ÿ=_q¿½ä¨>    _q¿  ëS ¿OS·¾m¨I¿_ñ¾ê ¾FER¿_ñ¾É¾’$I¿¿ê ¾’$I¿  ¾ð¿¸œe¾KzR¿_ñ¾ê ¾FER¿¿ê ¾’$I¿_ñ¾ê ¾ö=]¿  ¿ð¿´œe¾JzR¿_ñ¾ê ¾ö=]¿¿ê ¾’$I¿'E¿ê ¾’$I¿  ¨        ¿7œ½JXW¿_ñ¾ê ¾ö=]¿'E¿ê ¾’$I¿_ñ¾    0æ`¿  ¤      ¿aœ½LXW¿_ñ¾    0æ`¿'E¿ê ¾’$I¿_¿    ’$I¿  ¤      ¿8œ=LXW¿_ñ¾    0æ`¿_¿    ’$I¿_ñ¾ê >ö=]¿  ¨      ¿_œ=JXW¿_ñ¾ê >ö=]¿_¿    ’$I¿'E¿ê >’$I¿  ¿ð¿·œe>JzR¿_ñ¾ê >ö=]¿'E¿ê >’$I¿_ñ¾ê >FER¿  ¾ð¿°œe>KzR¿_ñ¾ê >FER¿'E¿ê >’$I¿¿ê >’$I¿  ëS ¿OS·>m¨I¿_ñ¾ê >FER¿¿ê >’$I¿_ñ¾É>’$I¿  OS·¾ëS ¿m¨I¿ê ¾_ñ¾FER¿ê ¾¿’$I¿É¾_ñ¾’$I¿  ¢Äþ¥ÄþIXW¿ê ¾_ñ¾FER¿É¾_ñ¾’$I¿ê ¾ê ¾kŽd¿  ¥Äþ¥ÄþJXW¿ê ¾ê ¾kŽd¿É¾_ñ¾’$I¿_ñ¾É¾’$I¿  §Äþ¢ÄþKXW¿ê ¾ê ¾kŽd¿_ñ¾É¾’$I¿_ñ¾ê ¾FER¿  Ο;ƿv¾Â/b¿_ñ¾ê ¾FER¿_ñ¾ê ¾ö=]¿ê ¾ê ¾kŽd¿  ğ;±¿v¾Ã/b¿ê ¾ê ¾kŽd¿_ñ¾ê ¾ö=]¿ê ¾ê ¾‡o¿  R%Ó¾£ê¨½vBh¿ê ¾œ•Ÿ½_q¿ê ¾ê ¾‡o¿½ä¨¾    _q¿  )%Ó¾˜ê¨½Bh¿½ä¨¾    _q¿ê ¾ê ¾‡o¿_ñ¾ê ¾ö=]¿  3%Ó¾s꨽€Bh¿½ä¨¾    _q¿_ñ¾ê ¾ö=]¿_ñ¾    0æ`¿  1%Ó¾‰ê¨=~Bh¿½ä¨¾    _q¿_ñ¾    0æ`¿ê ¾œ•Ÿ=_q¿  1%Ó¾rê¨=Bh¿ê ¾œ•Ÿ=_q¿_ñ¾    0æ`¿_ñ¾ê >ö=]¿  *%Ó¾«ê¨=Bh¿ê ¾œ•Ÿ=_q¿_ñ¾ê >ö=]¿ê ¾ê >‡o¿  ğ;ȿv>Ã/b¿_ñ¾ê >ö=]¿_ñ¾ê >FER¿ê ¾ê >‡o¿  ̟;°¿v>Â/b¿ê ¾ê >‡o¿_ñ¾ê >FER¿ê ¾ê >kŽd¿  ¥Äþ¢ÄÃ>IXW¿_ñ¾ê >FER¿_ñ¾É>’$I¿ê ¾ê >kŽd¿  ¥Äþ¥ÄÃ>JXW¿ê ¾ê >kŽd¿_ñ¾É>’$I¿É¾_ñ>’$I¿  ¢Äþ§ÄÃ>KXW¿ê ¾ê >kŽd¿É¾_ñ>’$I¿ê ¾_ñ>FER¿  OS·¾ëS ?m¨I¿ê ¾_ñ>FER¿É¾_ñ>’$I¿ê ¾?’$I¿  ¸œe¾¾ð¿KzR¿ê ¾_ñ¾FER¿ê ¾_ñ¾ö=]¿ê ¾¿’$I¿  ´œe¾¿ð¿JzR¿ê ¾¿’$I¿ê ¾_ñ¾ö=]¿ê ¾'E¿’$I¿  Æ¿v¾ÎŸÍ¾Â/b¿ê ¾_ñ¾FER¿ê ¾ê ¾kŽd¿ê ¾_ñ¾ö=]¿  ²¿v¾ÄŸÍ¾Ã/b¿ê ¾_ñ¾ö=]¿ê ¾ê ¾kŽd¿ê ¾ê ¾‡o¿  7H‚¾7H‚¾–Ùn¿ê ¾Ùd“¾_q¿ê ¾ê ¾‡o¿Ùd“¾ê ¾_q¿   H‚¾$H‚¾›Ùn¿Ùd“¾ê ¾_q¿ê ¾ê ¾‡o¿ê ¾ê ¾kŽd¿  7H‚¾H‚¾˜Ùn¿Ùd“¾ê ¾_q¿ê ¾ê ¾kŽd¿ê ¾ê ¾‡o¿  ƒ3†¾`ï²½÷v¿Ùd“¾ê ¾_q¿ê ¾ê ¾‡o¿ê ¾œ•Ÿ½_q¿  ƒ3†¾`ï²=÷v¿ê ¾œ•Ÿ=_q¿ê ¾ê >‡o¿Ùd“¾ê >_q¿  7H‚¾7H‚>–Ùn¿Ùd“¾ê >_q¿ê ¾ê >‡o¿ê ¾Ùd“>_q¿  $H‚¾ H‚>›Ùn¿ê ¾Ùd“>_q¿ê ¾ê >‡o¿ê ¾ê >kŽd¿  H‚¾7H‚>˜Ùn¿ê ¾Ùd“>_q¿ê ¾ê >kŽd¿ê ¾ê >‡o¿  °¿v¾ÎŸÍ>Â/b¿ê ¾ê >kŽd¿ê ¾_ñ>FER¿ê ¾ê >‡o¿  Æ¿v¾ÄŸÍ>Ã/b¿ê ¾ê >‡o¿ê ¾_ñ>FER¿ê ¾_ñ>ö=]¿  ¸œe¾¾ð?KzR¿ê ¾_ñ>FER¿ê ¾?’$I¿ê ¾_ñ>ö=]¿  ´œe¾¿ð?JzR¿ê ¾_ñ>ö=]¿ê ¾?’$I¿ê ¾'E?’$I¿  7œ½¨      ¿JXW¿ê ¾_ñ¾ö=]¿    _ñ¾0æ`¿ê ¾'E¿’$I¿  ^œ½¤      ¿LXW¿ê ¾'E¿’$I¿    _ñ¾0æ`¿    _¿’$I¿  ‰ê¨½1%Ó¾~Bh¿    ½ä¨¾_q¿    _ñ¾0æ`¿œ•Ÿ½ê ¾_q¿  r꨽1%Ó¾Bh¿œ•Ÿ½ê ¾_q¿    _ñ¾0æ`¿ê ¾_ñ¾ö=]¿  «ê¨½*%Ó¾Bh¿œ•Ÿ½ê ¾_q¿ê ¾_ñ¾ö=]¿ê ¾ê ¾‡o¿  `ï²½ƒ3†¾÷v¿œ•Ÿ½ê ¾_q¿ê ¾ê ¾‡o¿ê ¾Ùd“¾_q¿  `ï²½ƒ3†>÷v¿ê ¾Ùd“>_q¿ê ¾ê >‡o¿œ•Ÿ½ê >_q¿  £ê¨½R%Ó>vBh¿œ•Ÿ½ê >_q¿ê ¾ê >‡o¿    ½ä¨>_q¿  ˜ê¨½)%Ó>Bh¿    ½ä¨>_q¿ê ¾ê >‡o¿ê ¾_ñ>ö=]¿  s꨽3%Ó>€Bh¿    ½ä¨>_q¿ê ¾_ñ>ö=]¿    _ñ>0æ`¿  7œ½¨     ?JXW¿ê ¾_ñ>ö=]¿ê ¾'E?’$I¿    _ñ>0æ`¿  aœ½¤      ?LXW¿    _ñ>0æ`¿ê ¾'E?’$I¿    _?’$I¿  8œ=¤      ¿LXW¿    _ñ¾0æ`¿ê >_ñ¾ö=]¿    _¿’$I¿  cœ=¨      ¿JXW¿    _¿’$I¿ê >_ñ¾ö=]¿ê >'E¿’$I¿  ‰ê¨=1%Ó¾~Bh¿    ½ä¨¾_q¿œ•Ÿ=ê ¾_q¿    _ñ¾0æ`¿  ¯ê¨=6%Ó¾~Bh¿    _ñ¾0æ`¿œ•Ÿ=ê ¾_q¿ê >ê ¾‡o¿  tê¨=*%Ó¾Bh¿    _ñ¾0æ`¿ê >ê ¾‡o¿ê >_ñ¾ö=]¿  `ï²=ƒ3†¾÷v¿œ•Ÿ=ê ¾_q¿ê >Ùd“¾_q¿ê >ê ¾‡o¿  `ï²=ƒ3†>÷v¿ê >Ùd“>_q¿œ•Ÿ=ê >_q¿ê >ê >‡o¿  £ê¨=R%Ó>vBh¿œ•Ÿ=ê >_q¿    ½ä¨>_q¿ê >ê >‡o¿  œê¨=3%Ó>€Bh¿ê >ê >‡o¿    ½ä¨>_q¿    _ñ>0æ`¿  vê¨=*%Ó>Bh¿ê >ê >‡o¿    _ñ>0æ`¿ê >_ñ>ö=]¿  8œ=¤      ?LXW¿    _ñ>0æ`¿    _?’$I¿ê >_ñ>ö=]¿  _œ=¨      ?JXW¿ê >_ñ>ö=]¿    _?’$I¿ê >'E?’$I¿  ·œe>¿ð¿JzR¿ê >_ñ¾ö=]¿ê >_ñ¾FER¿ê >'E¿’$I¿  ±œe>¾ð¿KzR¿ê >'E¿’$I¿ê >_ñ¾FER¿ê >¿’$I¿  È¿v>ğ;Ã/b¿ê >_ñ¾ö=]¿ê >ê ¾‡o¿ê >_ñ¾FER¿  ®¿v>Ο;Â/b¿ê >_ñ¾FER¿ê >ê ¾‡o¿ê >ê ¾kŽd¿  7H‚>7H‚¾–Ùn¿ê >Ùd“¾_q¿Ùd“>ê ¾_q¿ê >ê ¾‡o¿  7H‚>7H‚¾•Ùn¿ê >ê ¾‡o¿Ùd“>ê ¾_q¿ê >ê ¾‡o¿   H‚> H‚¾›Ùn¿ê >ê ¾‡o¿ê >ê ¾‡o¿ê >ê ¾kŽd¿  ƒ3†>`ï²½÷v¿Ùd“>ê ¾_q¿ê >œ•Ÿ½_q¿ê >ê ¾‡o¿  ƒ3†>`ï²=÷v¿ê >œ•Ÿ=_q¿Ùd“>ê >_q¿ê >ê >‡o¿  7H‚>7H‚>–Ùn¿Ùd“>ê >_q¿ê >Ùd“>_q¿ê >ê >‡o¿  7H‚>7H‚>•Ùn¿ê >ê >‡o¿ê >Ùd“>_q¿ê >ê >‡o¿   H‚> H‚>›Ùn¿ê >ê >‡o¿ê >ê >‡o¿ê >ê >kŽd¿  ±¿v>ÄŸÍ>Ã/b¿ê >ê >‡o¿ê >_ñ>ö=]¿ê >ê >kŽd¿  Ç¿v>ΟÍ>Â/b¿ê >ê >kŽd¿ê >_ñ>ö=]¿ê >_ñ>FER¿  ·œe>¿ð?JzR¿ê >_ñ>ö=]¿ê >'E?’$I¿ê >_ñ>FER¿  °œe>¾ð?KzR¿ê >_ñ>FER¿ê >'E?’$I¿ê >?’$I¿  OS·>ëS ¿m¨I¿ê >_ñ¾FER¿É>_ñ¾’$I¿ê >¿’$I¿  ¢ÄÃ>¥ÄþIXW¿ê >_ñ¾FER¿ê >ê ¾kŽd¿É>_ñ¾’$I¿  ¦ÄÃ

Evan

问题1:问题读起来好像OP试图将4字节的数据读取到8字节的double中。解决方案是使用4字节的float,然后在需要时分配给double

随着数据大小的调整,快速解决方案是将文件中的数据直接读取到float

float tridata;
if (inFile.read((char*)&tridata, sizeof(tridata))
{ 
    //TODO: consume tridata. May want to bounds-test tridata first.
}
else
{ 
    // TODO: Handle file IO error
}

这可能不起作用,这取决于文件的编写方式,也不可能在所有平台上移植。假设输出文件是在与读取器相同的平台上生成的,这很可能就是您需要做的全部工作。为了让事情顺利进行,值得先尝试一下。

否则,将文件中的数据读取到通用字节缓冲区中,并通过交换字节转换为本地浮点字节排序。

一旦缓冲区被正确排序,就有很多方法可以强制缓冲区看起来像float。它们中的大多数将导致未定义的行为——它们可能在处理器和编译器X上工作,但在Y上不工作,甚至可能在X上不可靠。

有一件事总是有效的,那就是缓慢的方式:memcpy。随着现代编译器设置为高水平的优化,它通常不会那么慢。

//Open file
std::ifstream inFile(fname, std::ios::binary); // std::ios::in is implied by ifstream
// TODO: read to or seek to correct location in file
char buffer[sizeof(float)];
// read from file
if (inFile.read(buffer, sizeof(float))
{ // read 4 bytes of data from file
    float tridata;
    //TODO: flip endian as required
    std::memcpy(&tridata, buffer, sizeof(float));
    //TODO: consume tridata. May want to bounds-test tridata first.
}
else
{ // failed to read from file.
    // TODO: Handle file IO error
}

最新更新