2010-10-19 18 views
2

Je construis un message pour envoyer un numéro de 24 bits sur le réseau. Pour de petites machines endian, le code est (PTR est le pointeur vers le tampon de message):Comment écrire un message 24 bits après avoir lu à partir d'un entier de 4 octets sur une machine big endian (C)?

*ptr++ = (num >> 16) & 0xFF; 
*ptr++ = (num >> 8) & 0xFF; 
*ptr++ = (num)  & 0xFF; 

(Donc, si NUM0, num1, num2 et num3 sont les octets qui composent num, le message serait encodée comme num2|num1|num0.)

Quel devrait être le code pour l'encodage num2|num1|num0 sur un big endian machine?

Répondre

1

Votre code est portable, peu importe endianess. Les opérateurs de décalage >><< fonctionnent avec les valeurs et non avec la représentation.

3

La question ici est, dans quel ordre d'octets le message doit-il être envoyé/construit? Parce que si vous êtes sur une petite ou grande machine endian n'a pas d'importance en ce qui concerne num, car vous divisez déjà num en octets individuels d'une manière endian-agnostique.

Le code que vous avez enregistré stocke 24 bits de num en big endian (alias réseau). Donc, si c'est ce que vous voulez, vous avez déjà terminé. Si vous voulez stocker en grand peu à la place, juste inverser l'ordre:

*ptr++ = (num)  & 0xFF; 
*ptr++ = (num >> 8) & 0xFF; 
*ptr++ = (num >> 16) & 0xFF; 
0

Dans la machine de réception, quelle que soit endian-ness, si vous les recevez en même ordre que sont stockés dans ptr, les assembler comme ceci:

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]); 
+0

Merci à tous pour vos réponses. Sera-t-il correct de résumer les réponses comme suit: – Bikash

+0

@Bikash, vous frappez entrer trop tôt? :-) –

+0

1. Mon protocole nécessite que l'ordre des octets du message soit big endian – Bikash

0
int main(int argc, char** argv) { 

    int a, b; 
    a = 0x0f000000;  // Contain 32 bit value 
    printf("before = %d\n", a); 
    b = a & (~0xff000000); // convert the last 8 bits to zero so we got only 24 bit value in b 
    printf("After = %d\n", b); 
    return (EXIT_SUCCESS); 
} 

Il y a un certain nombre contenant un Valeur de 32 bits mais le nombre b ne contient que 24 bits, en commençant par le chiffre le moins significatif. Et cela ne dépend pas de l'endianness car les opérateurs bit-à-bit ne fonctionnent pas avec la représentation de la mémoire.

, vous pouvez utiliser

num = num & (~0xff000000); 

pour obtenir la dernière valeur 24 bits.

+0

Y at-il un problème avec 0x00ffffff? – Secure

+0

Il est également de travail afin que le temps pas besoin de l'opérateur Non (~). Cette solution plus optimale. –