*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

C 変数に対するメモリ領域を1バイト単位でアクセス201


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*


「C++にて、バイト型配列(バイナリーデータ)を取り扱う基本」

における一連の説明(知恵ノート)において、ここでは、

「変数に対するメモリ領域を1バイト単位でアクセス」

について説明します。






総合の目次


本ページを含めた関連事項の総合目次です。

http://note.chiebukuro.yahoo.co.jp/detail/n393772

関連サンプル


本サンプルと関連性のあるサンプルです。すなわち、次回以降のサンプルです。。

関連サンプル <ステップ1>
「変数に対するメモリ領域を1バイト単位でアクセス」
http://note.chiebukuro.yahoo.co.jp/detail/n393773

関連サンプル <ステップ2>
「整数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版 ステップ1>」
http://note.chiebukuro.yahoo.co.jp/detail/n393774

関連サンプル <ステップ3>
「整数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版 ステップ2>」
http://note.chiebukuro.yahoo.co.jp/detail/n393775

関連サンプル <ステップ4>
「整数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版 ステップ1>」
http://note.chiebukuro.yahoo.co.jp/detail/n393780

関連サンプル <ステップ5>
「整数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版 ステップ2>」
http://note.chiebukuro.yahoo.co.jp/detail/n393781

関連サンプル <ステップ6>
「実数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版>」
http://note.chiebukuro.yahoo.co.jp/detail/n393782

関連サンプル <ステップ7>
「実数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版>」
http://note.chiebukuro.yahoo.co.jp/detail/n393783

関連サンプル <ステップ8>
「バイト型配列変換に関する各種サンプル」
関連サンプル 8 と、それ以降のサンプルもあります。総合目次から参照して下さい。(バイト型配列変換に関するサンプルは、総合目次上で複数個あります)






はじめに


整数型オブジェクトにおいて、そのメモリ領域からバイト単位でアクセスします。
整数型オブジェクト内のどのセグメントとアクセスするのか指定して、バイト単位アクセスを行ないます。






関連サンプルと比べた特徴


下記の各種サンプルプログラムは、どれもバイト型配列変換関連のサンプルです。ただし、変換対象や、変換の扱い方が、各サンプルで異なります。詳しくは、下記に説明します。


関連サンプル <ステップ1>
「変数に対するメモリ領域を1バイト単位でアクセス」
整数型オブジェクトにおいて、そのメモリ領域からバイト単位でアクセスします。
整数型オブジェクト内のどのセグメントとアクセスするのか指定して、バイト単位アクセスを行ないます。


関連サンプル <ステップ2>
「整数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版 ステップ1>」
一般の整数型変数からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、リトルエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の整数型変数の型は、signed intとします。
なお、他の型については、次回の関連サンプルで対応します。


関連サンプル <ステップ3>
「整数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版 ステップ2>」
一般の整数型変数(int型変数等)からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、リトルエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の整数型変数の型は、様々な型に対応させます。
(テンプレート化して、様々な型に対応)


関連サンプル <ステップ4>
「整数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版 ステップ1>」
一般の整数型変数からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、ビッグエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の整数型変数の型は、signed intとします。
なお、他の型については、次回の関連サンプルで対応します。


関連サンプル <ステップ5>
「整数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版 ステップ2>」
一般の整数型変数(int型変数等)からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、ビッグエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の整数型変数の型は、様々な型に対応させます。
(テンプレート化して、様々な型に対応)

関連サンプル <ステップ6>
「実数型オブジェクト内データーをバイト型配列に変換 <リトルエンディアン版>」
一般の実数型変数(float型変数等)からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、リトルエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の実数型変数の型は、様々な型に対応させます。
(テンプレート化して、様々な型に対応)

関連サンプル <ステップ7>
「実数型オブジェクト内データーをバイト型配列に変換 <ビッグエンディアン版>」
一般の実数型変数(float型変数等)からバイナリーデーター(バイト型配列)を取得します。
(バイト型配列での配列要素の順番は、ビッグエンディアンとする)
また逆に、バイナリーデーターを変数へ設定します。
その際、対象の実数型変数の型は、様々な型に対応させます。
(テンプレート化して、様々な型に対応)

関連サンプル <ステップ8>
「バイト型配列変換に関する各種サンプル」
上記までのサンプルは、バイト型配列変換関連の基礎について解説しました。すなわち、基本中の基本のサンプルを紹介しただけです。次のステップとして、少しだけですが、なるべく応用的なサンプルを紹介して行きます。





サンプルコード


ここで取り上げるサンプルは、なるべく複雑にならない範囲で、バイト型配列変換を確かめられるものとします。






本サンプルの仕様概要


下記コードのSetDataToBytes()関数で、バイト型配列の各要素に値を設定します。
また、GetDataFromBytes()関数で、バイト型配列の各要素から値を取得します。





コード

ここでは、BytesOperation.h と言うファイル名にしています。



 

#ifndef _BYTES_OPERATION_
#define _BYTES_OPERATION_


// **************************************************************************
// **************************************************************************
// **                                                                      **
// **                        バイナリーデータ操作                          **
// **                                                                      **
// ** -------------------------------------------------------------------- **
// ** ファイル名 : BytesOperation.h                                        **
// ** 内容 : 一般の変数(int型変数等)からバイナリーデーター(バイト型配   **
// **        列)を取得します。また逆に、バイナリーデーターを変数へ設定し  **
// **        ます。その類の処理、すなわち、バイナリーデーター(バイト型配  **
// **        列)の操作関連の処理を行なう関数群です。                      **
// **************************************************************************
// **************************************************************************


namespace BytesOperation
{



//******************************************************************
// バイトリーデータ設定
//     整数型オブジェクトに入力指定されたデータをバイナリーに変換し、
//   それをバイナリー格納用配列(バイト型配列)に設定する。その際に、
//   セグメント(設定バイト位置)を指定して、バイトデータを設定しま
//   す。
//******************************************************************
template <typename DataTy, typename ByteTy> inline void SetDataToBytes( // バイトデータ設定
    //   戻り値: 無し
   int Byte_Number,  // セグメント(取得位置-バイト番号)[in]
   ByteTy* Binary_Data, // オフセットアドレス(バイト型配列)[in]
   DataTy Set_Data)  // 設定データ[in]
{
 *(Binary_Data + Byte_Number)
   = (Set_Data >> (8 * Byte_Number)) & 0xFF;
        // 指定位置分、右シフトした後に、それを0xFFとの論理積
        // を取るのは、0xFFは2進数11111111であるので、取得目
        // 的の8ビット(1バイト)よりも上位の桁が、0になるため
        // である。
}


// *****************************************************************
// バイトデータ取得
//     バイナリー格納用配列(バイト型配列)に格納されているバイナリ
//   ーデータを、該当の型のデータに変換し、それを該当整数型オブジェ
//   クトで出力する。なお、その際に、セグメント(設定バイト位置)を
//   指定して、バイトデータを取得します。
// *****************************************************************
template <typename DataTy, typename ByteTy> inline void GetDataFromBytes( // バイトデータ取得
    //   戻り値: 無し
   int Byte_Number,  // セグメント(取得位置-バイト番号)[in]
   ByteTy* Binary_Data, // オフセットアドレス(バイト型配列)[in]
   DataTy& Get_Data)  // 取得データ[out]
{
 Get_Data = (*(Binary_Data + Byte_Number)) << (8 * Byte_Number);
}


}  // namespace BytesOperation

#endif   // _BYTES_OPERATION_







上記コードの使用例






 // 整数の数値(入力用)
 signed int DataValue1_In = 1;  // 整数値(入力用1)
 signed int DataValue2_In = 2;  // 整数値(入力用2)
 signed int DataValue3_In = 3;  // 整数値(入力用3)
 signed int DataValue4_In = 4;  // 整数値(入力用4)



 // 整数の数値(出力用)
 signed int DataValue1_Out = 0;  // 整数値(出力用1)
 signed int DataValue2_Out = 0;  // 整数値(出力用2)
 signed int DataValue3_Out = 0;  // 整数値(出力用3)
 signed int DataValue4_Out = 0;  // 整数値(出力用4)


 unsigned char ByteArray[sizeof(signed int)]; // バイト型配列




   // - - - - - - - - - - - -
   // 整数値 ---> バイト型配列 変換
   // - - - - - - - - - - - -


   // バイナリーデータ設定
   BytesOperation::SetDataToBytes(0, ByteArray, DataValue1_In);
   BytesOperation::SetDataToBytes(1, ByteArray, DataValue2_In);
   BytesOperation::SetDataToBytes(2, ByteArray, DataValue3_In);
   BytesOperation::SetDataToBytes(3, ByteArray, DataValue4_In);


   // - - - - - - - - - - - -
   // バイト型配列 ---> 整数値 変換
   // - - - - - - - - - - - -


   // データ取得
   DataValue1_Out = 0;
   BytesOperation::GetDataFromBytes(0, ByteArray, DataValue1_Out);
   BytesOperation::GetDataFromBytes(1, ByteArray, DataValue2_Out);
   BytesOperation::GetDataFromBytes(2, ByteArray, DataValue3_Out);
   BytesOperation::GetDataFromBytes(3, ByteArray, DataValue4_Out);













コードの解説


サンプルコードの中に書かれていますコメントを読んで下さい。すなわち、コードの解説は、基本的にサンプルコードの中に書かれているコメントとします。





さいごに


本サンプルは、バイト型配列への変換における基礎的な範囲です。よって、総合目次から、引き続き各種サンプルを参照して下さい。