コンテンツにスキップ

バイト列操作

POD であれば以下の関数でデータを扱うことができます。 使用するには <cstring> のインクルードが必要です。

  • std::memset
  • std::memcpy
  • std::memcmp

これらは C の関数であるため、 任意の型を扱うために void ポインタ が使用されます。

次のコードで説明します。

static_assert(CHAR_BIT == 8, "Not support 1byte != 8bits");

struct FundamentalTypes {
    int16_t i;
    double d;
};

std::memset

バイト列に指定した値をセットします。 仕様は std::memset - cppreference.com を参照してください。

FundamentalTypes f;

// すべてのビットを0にする
std::memset(&f, 0, sizeof(f));
std::cout << f.i << std::endl;  // 0
std::cout << f.d << std::endl;  // 0

// すべてのビットを1にする
std::memset(&f, 0xff, sizeof(f));
std::cout << f.i << std::endl;  // -1   (2の補数表現の場合)
std::cout << f.d << std::endl;  // -nan (IEEE 754 の場合)

std::memcpy

バイト列をコピーします。 仕様は memcpy, memcpy_s - cppreference.com を参照してください。

FundamentalTypes f1;
f1.i = -2;
f1.d = 2.71;

FundamentalTypes f2;

// f1 から f2 へバイト列をコピー
std::memcpy(&f2, &f1, sizeof(FundamentalTypes));

std::cout << f2.i << std::endl;  // -2
std::cout << f2.d << std::endl;  // 2.71

std::memcmp

バイト列を比較します。 仕様は std::memcmp - cppreference.com を参照してください。

FundamentalTypes f1;
f1.i = -2;
f1.d = 2.71;

FundamentalTypes f2;
f2.i = 3 - 5;
f2.d = 2.71;

FundamentalTypes f3;
std::memset(&f3, 0, sizeof(f3));

if (std::memcmp(&f1, &f2, sizeof(FundamentalTypes)) == 0) {
    std::cout << "f1 and f2 are same" << std::endl;
} else {
    std::cout << "f1 and f2 are different" << std::endl;
}

if (std::memcmp(&f1, &f3, sizeof(FundamentalTypes)) == 0) {
    std::cout << "f1 and f3 are same" << std::endl;
} else {
    std::cout << "f1 and f3 are different" << std::endl;
}

実行結果は次のようになります。

f1 and f2 are same
f1 and f3 are different