| 12
 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;
} | 
Partager