バイナリストリーム:C++で使用(char*)&int型値の転送
文書ディレクトリ前言 一、整形配列値 をバイナリストリームで伝達する 1.1整形配列 1.2バイナリストリーム 1.2.1では、整形値を1バイトずつ2進ストリームに順次格納するにはどうすればいいのでしょうか. 1.2.2整形値を再構築するにはどうすればいいですか?
二、構造体配列賦値 前言
これまで羅技G 29ハンドル遠隔制御autolabor小車の小プロジェクトに参加し、樹莓派の操縦小車をサービス端とし、ハンドルデータを収集する部分をクライアントとし、両者の間でP 2 P通信を行い、ハンドルステアリング、アクセル、ストッパデータを樹莓派に送信するには、バイナリフロー伝達法を使用する必要がある.本稿では、バイナリフローを通じて整形配列を伝達する原理を紹介する.
一、バイナリストリームを利用して整形配列値を伝達する
1.1整形配列
例えばint num[3]={1,2,3};配列numには3つの数値1,2,3が格納されている.64ビットオペレーティングシステムでintが4バイトであるため、各数値の格納アドレス間隔は4バイトである.
メモリ空間アドレスに整形10進数1,2,3がどのように格納されているかを確認することができ、num[0]のアドレスにはint型に属し、4バイト、1 Byte=8 bitであり、そのうち01は1バイト、8ビットであるため、num[0]のアドレス内に01 00 00 00 00が格納されているのを見ることができます.したがってint型では,配列インデックスがシフトするたびにアドレスが4バイト移動して出力する.
1.2バイナリフロー
1.2.1では、整形値を1バイトずつ順番にバイナリストリームに格納するにはどうすればいいですか?
配列名が配列ヘッダアドレスに等価であるため、
このときbuffに格納されるバイナリストリームは次のようになります.
1.2.2どのように整形値を再構築しますか?
その後、整形数出力を4バイトずつ再構成し、
二、構造体配列賦値
これまで羅技G 29ハンドル遠隔制御autolabor小車の小プロジェクトに参加し、樹莓派の操縦小車をサービス端とし、ハンドルデータを収集する部分をクライアントとし、両者の間でP 2 P通信を行い、ハンドルステアリング、アクセル、ストッパデータを樹莓派に送信するには、バイナリフロー伝達法を使用する必要がある.本稿では、バイナリフローを通じて整形配列を伝達する原理を紹介する.
一、バイナリストリームを利用して整形配列値を伝達する
1.1整形配列
例えばint num[3]={1,2,3};配列numには3つの数値1,2,3が格納されている.64ビットオペレーティングシステムでintが4バイトであるため、各数値の格納アドレス間隔は4バイトである.
#include
using namespace std;
int main(int argc,char* argv[])
{
int num[3] = {
1, 2, 3};
for (int i = 0; i < 3;++i)
cout<<"num["<<i<<"] :"
<< &num[i] <<" "
<<"num["<<i<<"] :"
<<num[i]<< endl;
return 0;
}
/*--------------- ------------------
num[0] :010FF878 num[0] :1
num[1] :010FF87C num[1] :2
num[2] :010FF880 num[2] :3
*/
メモリ空間アドレスに整形10進数1,2,3がどのように格納されているかを確認することができ、num[0]のアドレスにはint型に属し、4バイト、1 Byte=8 bitであり、そのうち01は1バイト、8ビットであるため、num[0]のアドレス内に01 00 00 00 00が格納されているのを見ることができます.したがってint型では,配列インデックスがシフトするたびにアドレスが4バイト移動して出力する.
0x010FF878 01 00 00 00
0x010FF87C 02 00 00 00
0x010FF880 03 00 00 00
1.2バイナリフロー
1.2.1では、整形値を1バイトずつ順番にバイナリストリームに格納するにはどうすればいいですか?
配列名が配列ヘッダアドレスに等価であるため、
char *buff=(char *)&num[0]
が導入される.numはint型配列であり、配列numの各値は4バイトでメモリアドレスに格納され、charは文字型であり、64ビットオペレーティングシステムでは1バイトである.このときbuffに格納されるバイナリストリームは次のようになります.
buff[0]=01 buff[1]=00 buff[2]=00 buff[3]=00
buff[4]=02 buff[5]=00 buff[6]=00 buff[7]=00
buff[8]=03 buff[9]=00 buff[10]=00 buff[11]=00
1.2.2どのように整形値を再構築しますか?
その後、整形数出力を4バイトずつ再構成し、
(char *)num
により文字型ポインタbuffを整形ポインタに変換し、シフト毎に4バイトとする.(int *)buff
、buff[0]からbuff[3]を(int*)buff
、buff[4]からbuff[7]を(int*)(buff+4)
、buff[8]からbuff[11]を併用する#include
using namespace std;
int main(int argc, char* argv[])
{
int num[3] = {
1, 2, 3 };
char* buff;
buff = (char*)num;
for (int i = 0; i < 3;++i)
{
cout << "num[" << i << "] :"
<< &num[i] << " "
<< "num[" << i << "] :"
<< num[i] << endl;
cout << " :"
<< (int*)(buff + 4 * i) << " :"
<< *((int*)(buff + 4 * i)) << endl;
}
return 0;
}
/*--------------- ------------------
num[0] :00F3FCB8 num[0] :1
:00F3FCB8 :1
num[1] :00F3FCBC num[1] :2
:00F3FCBC :2
num[2] :00F3FCC0 num[2] :3
:00F3FCC0 :3
*/
二、構造体配列賦値
#include
using namespace std;
typedef struct birthday
{
int year;
int month;
int day;
} birthday;
int main(int argc,char* argv[])
{
int person_num;
cout << " :";
cin >> person_num;
int *num = new int[3*person_num];
cout << " " << 3 * person_num << " :" ;
for (int i = 0; i < 3 * person_num; ++i)
cin >> num[i];
char *array = (char *)num;
birthday *birth = new birthday[person_num];
int j=0;
for (int i=0; i < person_num ; ++i)
{
birth[i].year = *((int *)(array + 4*j));
birth[i].month= *((int *)(array + 4*(j+1)));
birth[i].day= *((int *)(array + 4*(j+2)));
j=j + 3;
switch(i)
{
case 0:
cout << "CJX :";
break;
case 1:
cout << "WJ :";
break;
}
cout << birth[i].year << "-"
<< birth[i].month << "-"
<< birth[i].day << endl;
}
delete[] birth;
birth = NULL;
delete[] num;
num = NULL;
return 0;
}
/*--------------- ------------------
:2
6 :1999 10 5 1996 8 31
CJX :1999-10-5
WJ :1996-8-31
*/