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]);
または、これに従って構造体の順序を作成することもできますが、その方法では、コードはビッグエンディアンでは機能しません。