前提・実現したいこと
Ubuntu20.10(Dockerコンテナ)上でホストバイトオーダーを求めようと考えました。一般的にはシェルで簡単に求められると思うのですが、今回はhtonl / ntohl を使って判別するケースを考えたいです。また、ホストはx86_64であるためリトルエンディアンであると前提します。
該当のソースコード
c
1// main.c 2#include <stdio.h> 3#include <netinet/in.h> 4 5 6int main() { 7 unsigned int x = 0xAABBCCDD; 8 // htonlはネットワークバイトオーダー(ビッグエンディアン)に 9 // ntohlはネットワークバイトオーダーの値をホストのエンディアンに変換する 10 // すなわち htonl(x) == ntohl(x) であればホストバイトオーダーはビッグエンディアンである 11 printf("ホストバイトオーダーは"); 12 if (htonl(x) == ntohl(x)) { 13 printf("big endian\n"); 14 } else { 15 printf("little endian\n"); 16 } 17}
実行結果
root@a6bb7bfe96dd:~# gcc main.c root@a6bb7bfe96dd:~# ./a.out ホストバイトオーダーはbig endian
上記プログラムからはビッグエンディアンであると言われます。
何が問題なのか?
同ホスト上でodコマンドを使ってエンディアンを求めると、リトルエンディアンであることが確認されます。私が該当のソースコードに書いたコードはホストがビッグエンディアンという結果を出していることが今回の問題です。
root@a6bb7bfe96dd:~# echo -n "1234ABCD" | od -t x 0000000 34333231 44434241 0000010
同様に下記のエンディアンを求めるプログラムからもリトルエンディアンであると言われます。
c
1 2#include <stdio.h> 3 4int main() { 5 int x = 1; // 0x00000001 6 printf("ホストバイトオーダーは"); 7 if (*(char *)&x ){ 8 printf("little endian\n"); 9 } else { 10 printf("big endian\n"); 11 } 12}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/21 04:32 編集
2021/01/21 04:32
2021/01/21 04:43