2016-05-17 4 views
-3

したがって、STLファイルから4バイト単位でデータを読み込もうとしています。各4バイト数は、x、y、またはz座標の値に対応します。私の目的のために、その数は本当に正確である必要はありません。値を二重として保存することになります。しかし、4バイトの数値を読み取るには、最初にchar [4]に格納する必要があります。私は同様に0 0 0 64iEEEで文字の配列からdouble値を復元する754

よう 外観に[4]私の文字を取得する "2" たとえば

私は数を読み込むしようとした場合、15 -22 -96 62

のような数0.314286ルックス

http://www.h-schmidt.net/FloatConverter/IEEE754.html この番号はIEEE754のバイナリ表現に対応すると判断しました。このフォーマットでは、大きさは依然として私が望む数です(例えば、2または0.314286の数値が必要です)が、プログラムでこれらの値を正しく表示することができません。

例:0 0 0 64 = 00000000 00000000 00000000 01000000 = 2 in 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が8バイトdoubleに4バイトのデータを読み込むしようとしているかのように読み取ります。これに対処するには、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 
} 
関連する問題