所以我试图以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
}