Ajouter +1 à un int32 fera monter l'adresse de 4 octets.
Vous pourriez utiliser memcpy(&g, reinterpret_cast<char *>(&col)+1, 1)
et ainsi de suite.
C'est mieux :
int32 col = color_mem[i];
struct splitted4byte
{
char r;
char g;
char b;
char a;
}
splitted4byte rgb;
memcpy(&rgb, &col, 4);
Vous devez vous préoccuper de l'ordre des octets dans le fichier col
d'ailleurs. Je ne sais pas quelle partie de l'int32 correspond à quelle couleur.
Vous devriez vous renseigner sur l'endianness. (google le, il y a des documentations)
Lorsque la valeur la plus élevée de R et les autres couleurs sont 0, si elle est stockée en tant que 1111 1111 0000 0000 0000 0000 0000 0000
Je veux dire si la représentation entière de la couleur RGBA(255,0,0,0) est égale à cette valeur binaire. Elle sera ordonnée en sens inverse dans la mémoire, c'est-à-dire 0000 0000 0000 0000 0000 0000 1111 1111
Vous devez donc le calculer.
Vous pouvez utiliser des fonctions de conversion réseau qui convertissent l'ordre des octets du réseau (big-endian) en ordre des octets de la machine hôte (little endian ou encore big endian). De cette façon, vous n'aurez pas besoin de modifier votre code en fonction de la machine. (la fonction est ntohl (network to host long), il y a aussi htons (host to network short) et autres pour 2-byte, il y a aussi be64toh() pour les entiers 64-bit, mais la fonction n'existe que sur les variantes Unix si je me souviens bien). Tout ce que vous aurez à faire est int32 col = ntohl(color_mem[i]);
Vous pouvez aussi faire en sorte que votre structure soit ordonnée de la sorte, mais votre code ne fonctionnera pas en big-endian.