2016-05-17 68 views
-3

所以我試圖以4個字節爲增量讀取STL文件中的數據。每個4字節的數字對應於x,y或z座標的值。爲了我的目的,這個數字不需要非常精確。將該值存儲爲雙精度值可以。但是,要讀取4個字節的數字,我必須先將它存儲在char [4]中。從使用iEEE的字符數組恢復雙值754

例如,如果我嘗試在數字改爲 「2」 讓我的焦炭[4] 樣子0 0 0 64

同樣,數量0.314286看起來像15 -22 -96 62

看完此鏈接http://www.h-schmidt.net/FloatConverter/IEEE754.html 我確定這些數字對應於IEEE754的二進制表示。在這種格式中,幅度仍然是我想要的數字(例如我想要的數字是2或0.314286),但我無法讓我的程序正確顯示這些值。

例如:0 0 0 64 = 00000000 00000000 00000000 01000000 = 2在IEEE754中 注意:這與上述鏈接中的網站轉換器略有不同,因爲我認爲字節序可能不同,但值仍然正確。

如何將4字節的char [4]轉換爲實際的double值?也許這個問題比我想象的要容易得多,但我似乎無法鑄造價值。

我在本網站讀入IEEE 754 http://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¿ ¦Äà 

埃文

+0

什麼是STL文件? –

+0

正如你剛纔所說的,請檢查[我如何提出一個好問題?](http://stackoverflow.com/help/how-to-ask)請稍等。 –

+0

https://en.wikipedia.org/wiki/STL_(file_format)#Binary_STL – Evan

回答

1

問題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上工作不穩定。

總是有效的一件事是the slow way: 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 
}