
(1)リトルエンディアン
typedef struct recvData{
int a;
unsigned char b[16];
unsigned char c[8];
unsigned int d[4];
} recvData_t;
recvData_t rData;
(2)ビッグエンディアン
typedef struct sendData{
int a;
unsigned int b[4];
unsigned int c[2];
unsigned int d[4];
} sendData_t;
sendData_t sData;
上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには
どうしたらよいでしょうか?
No.5ベストアンサー
- 回答日時:
○「リトルエンディアンの構造体」とか「ビッグエンディアンの構造体」というのは、残念ながら見たことがありません。
○質問の文章からだと
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]) ;
なんども使うなら、マクロなり関数なりにすればいいです。
この回答への補足
○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をビッグエンディアンになっていることは確認済みす。
よろしくお願い致します。
No.8
- 回答日時:
その後、エンディアン変換は成功されたでしょうか。
補足の「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];
No.7
- 回答日時:
どうでもいいことかもしれませんがhtonl()を「リトルエンディアンからビッグエンディアンに変換する関数」とは覚えないでください。
Host byte order TO Network byte orderなのでホストにより変わります。
No.6
- 回答日時:
(1) と (2) のそれぞれで各データがメモリ上どのようになっているのかを絵に描いて
「これをこうしたいからこんな操作が必要だよね」
って考えればいいだけじゃないのかなぁ....
No.4
- 回答日時:
何か誤解を招きそうな表現や嘘書いてるし・・・
>htol()やhtonl()はビッグエンディアンのマシンにもありますよ。
htol()でなくてhtons()です。
>何もしないだけで。
「何もせず引数の値をそのまま返す」です。
申し訳ありません。
No.2
- 回答日時:
a,dについては、#1さんの言う通り、ビットシフトでやるなり、bswap()やhtonl()
なりで変換してください。(htonlはx86やIA64の様に、リトルのCPUのみですが)
b,cはバイトですよね?バイトにはエンディアン関係ないし、型が異なっています。
どう格納したいのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaのプログラムについて
-
javaのプログラムについて
-
カレンダー作成について質問です。
-
arraycopy コンパイルエラー
-
乱数の生成について
-
ループ処理の際、最後だけ","を...
-
日付の比較(Beforeメソッド)
-
Java 配列 勝敗、引き分け判定...
-
コンソール入力内容をエコーさせる
-
javaのエラーが回収できない
-
論理演算子”||”またはの入力方法
-
java eclipse do-while文
-
Java 入力した整数値の合計を、...
-
多次元配列について
-
連立方程式を解くプログラムの...
-
コインのプログラムが作れずに...
-
JAVAのwhileループについての質...
-
pasteHTMLでパスが勝手に変換さ...
-
動的配列が存在(要素が有る)か...
-
ファイル書き込みに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
論理演算子”||”またはの入力方法
-
数値⇒漢数字変換 java
-
java キーボード入力された値の...
-
Randomメソッドの確率設定
-
テキストボックスに入力された...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
7つ数字を表示したら改行すると...
-
countに実行した回数をいれたい...
-
JAVAのfor文で困っています。
-
(急いでいます)Javaで3回間違...
-
Java 入力した整数値の合計を、...
-
Java、2の0乗~10乗の表示
-
点数をだす時に、maxとminがお...
-
javaです。 途中まで出来ている...
-
Ctrl+Zが入力されると終了する...
-
配列を逆順させて表示させる方...
-
Java 配列 勝敗、引き分け判定...
-
繰り返しによる星印の出力
-
javaプログラムについて
おすすめ情報