01-03.データとは
03.データとは
ビット
省略
バイト
省略
実は1バイト = 8ビットとは限らないことに注意 ※環境依存
オクテット
正確に8ビットのこと
ネットワーク上は様々な機器が存在している
⇒1バイト ≠ 8ビットの可能性がある
ネットワークで正確に8ビット1単位を示すときにつかわれるのがオクテット
バイトオーダー
多バイトデータ( 2バイト以上のデータ )の取り扱い方法
メモリには1バイトずつ格納される
ビッグエンディアン
上位バイトから順番に扱う
PowerPCなど…
リトルエンディアン
下位バイトから順番に扱う
Intel系...いまどきのPCはすべてリトル
ネットワーク上は様々な機器が存在している
⇒PC以外と通信する可能性
⇒バイトオーダーが異なる機器同士での通信の可能性
問題
リトルエンディアンの環境から、5000個注文の送信をしました!( 5000と送信 )
プログラム上でのデータの取り扱い:0x1388
送信したかったデータ(16進数):0x1388
メモリの格納順:0x88・0x13
送信順:0x88・0x13
受信したほうはビッグエンディアン環境でした。何個の注文だと思うでしょうか?
受信順:0x88・0x13
メモリの格納順:0x88・0x13
プログラム上でのデータの取り扱い:0x8813
課題
CなりC++で!( VisualStudio、paiza.io )
int型( 4バイト )の変数を用意
0x12 34 56 78を格納
int val = 0x12345678;
メモリの先頭から1バイトずつ出力せよ!
注意:1バイトずつ ⇒char型利用すると文字で出そうとします!
リトルエンディアン:78 56 34 12
ビッグエンディアン:12 34 56 78
code:sample.c
int val = 0x12345678; // 4バイトデータ
char* p; // 1バイト領域のアドレスを入れるためのポインタ char* p = (char*)&val;
p = &val; // valの先頭アドレスをポインタpに格納
printf( "%x\n", *p ); // pのアドレスがさしている先の中身を出力
p++; // 1バイト分ずらす
printf( "%x\n", *p ); // pのアドレスがさしている先の中身を出力
p++; // 1バイト分ずらす
printf( "%x\n", *p ); // pのアドレスがさしている先の中身を出力
p++; // 1バイト分ずらす
printf( "%x\n", *p ); // pのアドレスがさしている先の中身を出力
code:sample.cpp
int val = 0x12345678; // 4バイトデータ
char* p = (char*)&val; // valの先頭アドレスをポインタpに格納
std::cout << std::hex << +(*p) << std::endl;
p++;
std::cout << std::hex << +(*p) << std::endl;
p++;
std::cout << std::hex << +(*p) << std::endl;
p++;
std::cout << std::hex << +(*p) << std::endl;
code:union.cpp
// 共用体の利用
union UnionData{
int val;
};
int main(void){
// Your code here!
UnionData data;
data.val = 0x12345678;
std::cout << std::hex << +data.ch0 << std::endl; std::cout << std::hex << +data.ch1 << std::endl; std::cout << std::hex << +data.ch2 << std::endl; std::cout << std::hex << +data.ch3 << std::endl; }