- ベストアンサー
リトルエンディアン→ビッグエンディアン
- リトルエンディアンの構造体のデータをビッグエンディアンの構造体に格納する方法は?
- リトルエンディアンとビッグエンディアンの構造体の違いとは?
- リトルエンディアンとビッグエンディアンのデータの変換方法を教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
○「リトルエンディアンの構造体」とか「ビッグエンディアンの構造体」というのは、残念ながら見たことがありません。 ○質問の文章からだと rData.bにリトルエンディアンで8ビット*4(=32ビット)が4つ入っている →これをsData.b (int型 [4] )に rData.cにリトルエンディアンで8ビット*4(=32ビット)が2つ入っている →これをsData.c (int型 [2])に とも rData.bにリトルエンディアンで8ビット*16(=128ビット)が1つ入っている →これをsData.b (int型 [4] )をまとめて1つの128ビットと見做してビッグエンディアンに rData.cにリトルエンディアンで8ビット*8(=64ビット)が1つ入っている →これをsData.c (int型 [2])にまとめて1つの64ビットと見做してビッグエンディアンに とも解釈できます。あなたのやりたいのは何でしょう? ○ .a, .dはそのままでいいのでしょうか? ○動かそうとしている計算機では、intの内部表現がビッグエンディアンになっていることは確認していますか? ○ unsigned intが32ビットだとして、ベタな方法はビットシフトとビット毎のorを使うものでしょう unsigned int ui = (b[0] << 24) | (b[1] << 16) | ( b[2] << 8 ) | (b[3]) ; なんども使うなら、マクロなり関数なりにすればいいです。
その他の回答 (7)
その後、エンディアン変換は成功されたでしょうか。 補足の「sData.b (int型 [4] ) をまとめて1つの128ビットと見做して」という点は確かでしょうか? 間違いなければ、下のような処理で期待される結果が得られると思いますけれども... union { recvData_t in; sendData_t out; } rData; sendData_t sData; rData.in = anyData; /* 何らかのrecvData_tデータをセット */ sData.a = htonl(rData.out.a); sData.b[0] = htonl(rData.out.b[0]); sData.b[1] = htonl(rData.out.b[1]); sData.b[2] = htonl(rData.out.b[2]); sData.b[3] = htonl(rData.out.b[3]); sData.c[0] = htonl(rData.out.c[0]); sData.c[1] = htonl(rData.out.c[1]); sData.d[0] = htonl(rData.out.d[0]); sData.d[1] = htonl(rData.out.d[1]); sData.d[2] = htonl(rData.out.d[2]); sData.d[3] = htonl(rData.out.d[3]); sendData_t tmp = sData; sData.b[0] = tmp.b[3]; sData.b[1] = tmp.b[2]; sData.b[2] = tmp.b[1]; sData.b[3] = tmp.b[0]; sData.c[0] = tmp.c[1]; sData.c[1] = tmp.c[0]; sData.d[0] = tmp.d[3]; sData.d[1] = tmp.d[2]; sData.d[2] = tmp.d[1]; sData.d[3] = tmp.d[0];
- wormhole
- ベストアンサー率28% (1626/5665)
どうでもいいことかもしれませんがhtonl()を「リトルエンディアンからビッグエンディアンに変換する関数」とは覚えないでください。 Host byte order TO Network byte orderなのでホストにより変わります。
- Tacosan
- ベストアンサー率23% (3656/15482)
(1) と (2) のそれぞれで各データがメモリ上どのようになっているのかを絵に描いて 「これをこうしたいからこんな操作が必要だよね」 って考えればいいだけじゃないのかなぁ....
- wormhole
- ベストアンサー率28% (1626/5665)
何か誤解を招きそうな表現や嘘書いてるし・・・ >htol()やhtonl()はビッグエンディアンのマシンにもありますよ。 htol()でなくてhtons()です。 >何もしないだけで。 「何もせず引数の値をそのまま返す」です。 申し訳ありません。
- wormhole
- ベストアンサー率28% (1626/5665)
>#2さんへ htol()やhtonl()はビッグエンディアンのマシンにもありますよ。 何もしないだけで。
- unacyo
- ベストアンサー率51% (35/68)
a,dについては、#1さんの言う通り、ビットシフトでやるなり、bswap()やhtonl() なりで変換してください。(htonlはx86やIA64の様に、リトルのCPUのみですが) b,cはバイトですよね?バイトにはエンディアン関係ないし、型が異なっています。 どう格納したいのですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
変換する関数なりなんなりを手で書く.
補足
○b,cについては、やりたいのは、以下の指摘の方です。 ----------------------------------------------------------------------------- rData.bにリトルエンディアンで8ビット*16(=128ビット)が1つ入っている →これをsData.b (int型 [4] )をまとめて1つの128ビットと見做してビッグエンディアンに rData.cにリトルエンディアンで8ビット*8(=64ビット)が1つ入っている →これをsData.c (int型 [2])にまとめて1つの64ビットと見做してビッグエンディアンに ------------------------------------------------------------------------------- ○a,dについてもリトルからビッグに変換が必要なので、 sData.a = htonl(rData.a);のように関数を実行すれば問題ないでしょうか? dの方はどうすればよいでしょうか? ○動かそうとしているハードは、intをビッグエンディアンになっていることは確認済みす。 よろしくお願い致します。