J'essaye d'échanger des octets pour une affectation, et j'ai pensé que ce serait la façon de le faire. P pointe vers l'objet scalaire à inverser size est le nombre d'octets de l'objet.Échange d'octets en C (endianness)
void *ReverseEndian(void *p, size_t size)
{
char *head = (char *)&p;
char *tail = head + size - 1;
for (; tail > head; --tail, ++head) {
char temp = *head;
*head = *tail;
*tail = temp;
}
return p;
}
Y a-t-il quelque chose qui ne va pas de soi? Je reçois une erreur avec mon code de test du professeur:
#define TestIt(a, b) TestReverse((void *)&(a),\
ReverseEndian((void *)&(b), sizeof(b)), sizeof(b))
int main()
char ch = 0x01, ch1 = ch;
short sh = 0x0123, sh1 = sh;
long lo = 0x, lo1 = lo;
float fl = 1234.567e27F, fl1 = fl;
double db = 123456.567890, db1 = db;
long double ld = 987654.321053e-204L, ld1 = ld;
void *vp = (void *)0x0123, *vp1 = vp;
char *cp = (char *)0x4567, *cp1 = cp;
char *ip = (char *)0x89AB, *ip1 = ip;
TestIt(ch1, ch);
TestIt(sh1, sh);
TestIt(lo1, lo);
TestIt(fl1, fl);
TestIt(db1, db);
TestIt(ld1, ld);
TestIt(vp1, vp);
TestIt(cp1, cp);
TestIt(ip1, ip);
printf("ReverseEndian succeeded!\n");
return EXIT_SUCCESS;
}
void TestReverse(const void *before, const void *after, size_t size)
{
const char *cpBfore = (const char *)before;
const char *cpAfter = (const char *)after;
const char *tail;
for (tail = cpBfore + (size - 1); size; --size)
if (*tail-- != *cpAfter++)
{
fprintf(stderr, "ReverseEndian failed!\n");
exit(EXIT_FAILURE);
}
}
Le type de '& p;' dans '' ReverseEndian' est vide ** ', et vous êtes l'assigner à un 'char *', pourquoi? Qu'est-ce que ça veut dire?En C, vous ne devriez pas avoir besoin de lancer la plupart du temps, et si vous utilisez un casting, vous devez exactement savoir pourquoi (faire en sorte que le compilateur ne m'avertit pas n'est pas une raison). –
Je pensais qu'un caractère est garanti à un octet. J'ai donc pensé que vous pouviez pointer vers le premier octet avec un pointeur sur char, puis échanger les octets de cette façon. – Crystal