int32 に +1 を追加すると、アドレスが 4 バイト上がります。
などを使用できますmemcpy(&g, reinterpret_cast<char *>(&col)+1, 1)
。
より良い方法:
int32 col = color_mem[i];
struct splitted4byte
{
char r;
char g;
char b;
char a;
}
splitted4byte rgb;
memcpy(&rgb, &col, 4);
ところで、バイトの順序に注意する必要がありますcol
。int32 のどの部分がどの色かわかりません。
エンディアンについて読む必要があります。(ググってください、ドキュメントがあります)
R の最大値と他の色が 0 の場合、それが として格納されている1111 1111 0000 0000 0000 0000 0000 0000
場合、色 RGBA(255,0,0,0) の整数表現がこのバイナリ値に等しいかどうかを意味します。メモリ内では逆順になる0000 0000 0000 0000 0000 0000 1111 1111
ため、これを計算する必要があります。
ネットワーク バイト オーダー (ビッグ エンディアン) をホスト マシンのバイト オーダー (リトル エンディアンまたはビッグ エンディアン) に変換するネットワーク変換関数を使用できます。これにより、マシンに応じてコードを変更する必要がなくなります。(関数は ntohl (ネットワークからホストへの長い) であり、2 バイトには htons (ホストからネットワークへの短い) などもあり、64 ビット整数には be64toh() もありますが、関数は Unix バリアントでのみ終了します。私は正しく覚えています。)あなたがする必要があるのは、int32 col = ntohl(color_mem[i]);
または、これに従って構造体の順序を作成することもできますが、その方法では、コードはビッグエンディアンでは機能しません。