Benpianはどうなるか、なぜ、どのように3次元エンディアンについて
何
エンディアン、バイトは文字通り理解(バイト)シーケンス、マルチバイトで構造(または変数ファイルなど)のためのコンピュータサイエンス大会、現在に分けビッグエンディアンとリトルエンディアン
uint32_t例えば4バイト型、0x12345678のは、変数の型に格納され、視点からの変数は、上位バイト変数0x12を、0x78と低バイトの変数です。
可変とき ハイ バイトがメモリに格納されている 高い アドレス、可変 低の バイトがメモリに格納されている 低い アドレスである場合には、リトルエンディアンの下に示すように:
変数とき に高い バイトがメモリに保存されている 低の アドレス、変数 低いの バイトは、のメモリに記憶されている 高 などのアドレス、ビッグエンディアンの下に示すように:
なぜ
もちろん単純に合意された定義は、ダイレクト・メモリが、なぜべきな大会?なぜ、2つのバイトシーケンスに分け?利点は何ですか?
2つのタイプのオブジェクト、の2種類のバイト順序ビッグエンディアン のために意図された 人間、リトルエンディアンの ために意図され たコンピュータ。
ビッグエンディアン人間が読めるの食事は、時にネットワークソケットネットワークバイト順序は、ビッグエンディアン使用され、処理負荷がヒトに減少させることができるように、バイトストリームを読み取る慣習処理に従って定義されますマルチビット番号を送信する場合、読書習慣に応じて、受信した上位バイト、8の数は、このように直接左を添加。
コンピュータに準拠したリトルエンディアンオーダー処理
1.コンピュータが読み出し専用メモリアドレスの順番に従って、データ形式は気にしない読み込み
我々は、コンピュータのデータ処理があることを下位アドレスから我々が期待するもの取るために、アクティブローアドレスのメモリアドレスに変数データを下げる必要があるので、2データローから処理するコンピュータ化されたデータは、これは、コンピュータ設計の定義です開始します。累積運転時間、ビット付加、ビット10は、最終的な結果を蓄積し、順次添加しない、CF2を供給する。
要約すると、人間志向のビッグエンディアン順序は、処理を高速化するために思考、リトルエンディアン指向コンピュータを簡素化します。
どうやって
コンピュータを決定する方法、ビッグエンディアンかリトルエンディアンのですか?
あなたは、単にC言語プログラムの判定期間を作ることができます
#include <cstdio>
#include <cstdint>
int main()
{
uint32_t test_code = 0x12345678;
uint8_t* first = (uint8_t*)&test_code; //指针指向变量的内存首字节
printf("first address value is %x,is %s\n",
*first, *first == 0x12 ? "Big Endian" : "Little Endian");
return 0;
}
あなたは出力を見ることができます
可変TEST_CODE(下部メモリアドレス)の最初のメモリアドレスへの最初のポインタは、結果が0x78と(可変低いアドレス)を抽出し、リトルエンディアンから見た上記のように定義
直接出力を表示することに加えて、我々は、ここで使用されるメモリが保存されている方法を見て、自分で見ることができますollyDbg ollyDbgを使用して、プログラムのデバッグモード出力上記のデバッグのexeファイルは、EXEファイルを開きます。
すべての文字列を右検索プログラム、それは簡単な暗号化プログラムではないので、主に、検索するここで、文字列のprintfは、それがコールに場所を見つけるのは簡単です:
直接変数ダンプのアドレスを表示
そして、出力プログラムは、したがって、リトルエンディアン、低ストレージ・アドレス0x78とし、高い記憶アドレスと0x12になっています。