バイナリストリーム: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バイトである.
    #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
    
    */