Question métaphysique sur les unions
Dans l'union U2, len est déclaré en short au lieu de char, et du coup, "char command" est codé sur 2 octets. Mais pourquoi ???
Merci de votre aide.
Plateforme : WinXP, mingw32, g++
Compilation :
g++ -Wall -gstabs -o union.exe union.cpp && union
-----------------------------------------
Sortie du programme :
Union 1 :
01 02 00 01
Union 2 :
01 00 02 00 00 01
-----------------------------------------
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
#include <iostream>
#include <iomanip>
using namespace std;
/*
len : nbre d'octets dans data
*/
typedef union U1
{
char _bytes[512]; // 512 octets
struct
{
char command; // 1 octet
char len; // 1 octet
char data[512-sizeof(char)-sizeof(char)]; // 510 octets
} dPkt;
} T1;
typedef union U2
{
char _bytes[512]; // 512 octets
struct
{
char command; // normalement 1 octet
short len; // 2 octet
char data[512-sizeof(char)-sizeof(short)]; // 509 octets
} dPkt;
} T2;
void affiche(const char *s,size_t n);
int main()
{
short value=256; // 256 = 0x0100 ; codage little-endian : 00 01
T1 v1;
v1.dPkt.command=1;
v1.dPkt.len=2;
memcpy(v1.dPkt.data,&value,sizeof(short));
cout<<"Union 1 :\n";
affiche(v1._bytes,4); // 1 (command) + 1 (len) + 2 (value) = 4
T2 v2;
v2.dPkt.command=1;
v2.dPkt.len=2;
memcpy(v2.dPkt.data,&value,sizeof(short));
cout<<"\nUnion 2 :\n";
affiche(v2._bytes,6); // 2 et pas 1! (command) + 2 (len) + 2 (value) = 6
return 0;
}
void affiche(const char *s,size_t n)
{
for(size_t i=0;i<n;i++)
cout<<setfill('0')<<hex<<setw(2)<<(short)s[i]<<' ';
cout<<endl;
} |