memcpy()
あなたが望むもののために設計されているとは思いません。一般に、memcpy()
1 つまたは複数のオブジェクト全体 (オブジェクトは int、char、long long など) をコピーするために使用します。
int a[4] = { 1, 2, 3, 4 };
int b[3];
int c[5] = { 0 };
::memcpy(b, a, 3 * sizeof(int)); // b is { 1, 2, 3 }
::memcpy(c+2, b, 3 * sizeof(int)); // c is { 0, 0, 1, 2, 3 }
c+2 は「c + 2 バイト」ではありません。「c + 2 int」(Win32/x86 システムでは 8 バイト) です。
char または unsigned char ポインターにキャストすることで個々のバイトにアクセスできますが、多くの落とし穴があるため、何をしているのかを本当に理解している場合を除き、お勧めしません。
unsigned x = 0;
unsigned char *px = reinterpret_cast<unsigned char *>(&x);
px[0] = 0xFF;
px[2] = 0xAA;
ここでの危険の 1 つは、コンピューターが整数を格納する方法についての知識を前提としていることです。x86 システムでは x は 0x00AA00FF になりますが、Sun Sparc システムでは 0xFF00AA00 になります。
整数の一部を設定する必要がある場合は、"or" と "shift" を使用する方がよい場合がよくあります。
x = (0xFF<<24) | (0xAA<<8);
どのアーキテクチャでも 0xFF00AA00 が返されます。0xFF<<24 は、値 0xFF を 24 ビット左にシフトし、0xFF000000 にします。0xAA<<8 は、値 0xAA を左に 8 ビットシフトし、0x0000AA00 にします。
それらを「or」して、0xFF00AA00 を与えます。