![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
(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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
配列を逆順させて表示させる方...
-
Java、2の0乗~10乗の表示
-
java キーボード入力された値の...
-
論理演算子”||”またはの入力方法
-
java 入力 3 4 3 出力 ABC DEFG...
-
*で正三角形を出力
-
Javaでキーボードから入力され...
-
テキストボックスに入力された...
-
javaプログラムについて
-
for文を使った累乗の計算方法に...
-
JAVAのfor文で困っています。
-
階乗
-
数独のJavaプログラム
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
キーボードから10人分の点数を...
-
7つ数字を表示したら改行すると...
-
javaで数独を解くプログラムに...
-
Javaの練習問題
-
javaのプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
Java、2の0乗~10乗の表示
-
数値⇒漢数字変換 java
-
論理演算子”||”またはの入力方法
-
コマンドライン引数の例外処理...
-
JAVAのfor文で困っています。
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Java 入力した整数値の合計を、...
-
7つ数字を表示したら改行すると...
-
テキストボックスに入力された...
-
countに実行した回数をいれたい...
-
総称型ArrayList<E>への参照...
-
Randomメソッドの確率設定
-
Ctrl+Zが入力されると終了する...
-
学校で課題を出されて困ってい...
-
Java キーボードから負の数が入...
-
階乗の式
-
キーボードから10人分の点数を...
-
Java 配列<選挙>
おすすめ情報