Linux Cでcpuサイズのエンドシーケンスを判断するいくつかの方法
5761 ワード
背景
ネットワークプログラミングでは,プロトコルを処理する際に,サイズエンドシーケンスの問題に遭遇することが多く,処理エラーは誤った結果を得る.
一般的に、x 86およびarmプロセッサは小エンドシーケンスを使用し、PowerPCは大エンドシーケンスを使用し、ネットワークで伝送されるバイトは大エンドシーケンスを使用する.
プログラマーとしては,エンジニアリング基準に基づいてサイズエンドシーケンスの変換が必要である.
基本概念
マクロシーケンス(マクロモード):データの下位ビットがメモリの高アドレスに保存され、データの上位ビットがメモリの低アドレスに保存されることを意味します.小端序(小端モード):データの低位がメモリの低アドレスに保存され、データの高位がメモリの高アドレスに保存される.
テストプログラム
1.Linuxカーネル対サイズ端の処理
2.連合体の使用
3.ポインタの使用
まとめ
大きさの端順を判断するのは基本的な操作であり,比較的容易である.
インスタンスにより,サイズ端の意味を理解すれば,実現方法は多くの種類があることが分かる.
他の問題も似ていて、問題の核心の本質を理解すれば、どんな言語を使っても、解決方法は一つではありません.
継続的な学習の鍵は、考え方を絶えず広げ、異なる方位から問題を見る能力を高め、最適な(最も簡単な)解決策を見つけることです.
ネットワークプログラミングでは,プロトコルを処理する際に,サイズエンドシーケンスの問題に遭遇することが多く,処理エラーは誤った結果を得る.
一般的に、x 86およびarmプロセッサは小エンドシーケンスを使用し、PowerPCは大エンドシーケンスを使用し、ネットワークで伝送されるバイトは大エンドシーケンスを使用する.
プログラマーとしては,エンジニアリング基準に基づいてサイズエンドシーケンスの変換が必要である.
基本概念
マクロシーケンス(マクロモード):データの下位ビットがメモリの高アドレスに保存され、データの上位ビットがメモリの低アドレスに保存されることを意味します.小端序(小端モード):データの低位がメモリの低アドレスに保存され、データの高位がメモリの高アドレスに保存される.
テストプログラム
1.Linuxカーネル対サイズ端の処理
static union {
char c[4];
unsigned long mylong;
} endian_test = {{ 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)
if (ENDIANNESS == 'b')/* */
printf("
");
else
printf("
");
2.連合体の使用
int check_cpu_type()
{
union w {
int a;
char b;
} c;
c.a = 1;
if (c.b == 1)/* */
printf("
");
else
printf("
");
}
3.ポインタの使用
int check_cpu_type()
{
int i = 0x1;
unsigned char *p;
p = (unsigned char *)&i;
if (*p)
printf("
");
else
printf("
");
}
まとめ
大きさの端順を判断するのは基本的な操作であり,比較的容易である.
インスタンスにより,サイズ端の意味を理解すれば,実現方法は多くの種類があることが分かる.
他の問題も似ていて、問題の核心の本質を理解すれば、どんな言語を使っても、解決方法は一つではありません.
継続的な学習の鍵は、考え方を絶えず広げ、異なる方位から問題を見る能力を高め、最適な(最も簡単な)解決策を見つけることです.