搜档网
当前位置:搜档网 › 使用struct指针强制转换int和char[]时产生的大小头问题

使用struct指针强制转换int和char[]时产生的大小头问题

typedef struct _Data32{
int ndata;
}Data32,*PData32;

typedef struct _Data8{
char cdata[5];
}Data8,*PData8;


测试一:int--->char[]

Data32 data32;
PData8 pdata8;

data32.ndata = 0x01020304;
pdata8 = (PData8)&data32;

int i;
for(i=0; i<4; i++)
{
printf("\ndata[%d] : 0x%02x\n",i,pdata8->cdata[i]);
}

result:(int = 0x01020304;)

data[0] : 0x04

data[1] : 0x03

data[2] : 0x02

data[3] : 0x01

conclusion:

int数据为0x01020304,当用struct指针强制转换赋值给4个char之后,由于当前测试的linux系统是小头,所以int数据会将低地址的1个字节放入char数组的第1个字节,将高地址的1个字节放入char数组的第4个字节。


测试二:char[]--->int

PData32 pdata32;
Data8 data8;

data8.cdata[0] = 0x01;
data8.cdata[1] = 0x02;
data8.cdata[2] = 0x03;
data8.cdata[3] = 0x04;

pdata32 = (PData32)&data8;
printf("\npdata32->ndata : 0x%08x\n",pdata32->ndata);

result:(char[] = 0x01 0x02 0x03 0x04)

pdata32->ndata : 0x04030201

conclusion:

char[] = 0x01 0x02 0x03 0x04,当用struct指针强制转换赋值给1个int之后,由于当前测试的linux系统是小头,所以char[]会将第1个字节放入int的低地址,将第4个字节放入int的高地址。

int数据的顺序仍然同char[]一样,但是当显示打印的时候,就会反向打印。

============================
结论:
============================
在int和char[]相互赋值时,不能简单地使用指针进行强制转换赋值,需要借助于移位操作符。

测试一:int--->char[]

data32.ndata = 0x01020304;
int i;
for(i=0; i<4; i++)
{
pdata8->cdata[i] = data32.ndata >> (32-(i+1)*8);
printf("\npdata8->cdata[%d] = 0x%02x\n",i,pdata8->cdata[i]);
}

result:

pdata8->cdata[0] = 0x01

pdata8->cdata[1] = 0x02

pdata8->cdata[2] = 0x03

pdata8->cdata[3] = 0x04


测试二:char[]--->int

PData32 pdata32;
Data8 data8;

data8.cdata[0] = 0x01;
data8.cdata[1] = 0x02;
data8.cdata[2] = 0x03;
data8.cdata[3] = 0x04;

int i;
pdata32->ndata = 0;
for(i=0; i<4; i++)
pdata32->ndata |= (data8.cdata[i] << (32-(i+1)*8));
printf("\npdata32->ndata = 0x%08x\n",pdata32->ndata);

result:

pdata32->ndata = 0x01020304


======================================
测试环境:little-endian
测试内容:char[20];存入到结构体中,结构中既包含int,又包含char[],测试int数据是否反,char[]数据是否反?
======================================

typedef struct A
{
int a;
int b;
char c[4];
char d[4];
char e[4];
}SA,*PSA;

char NFCmsg[20];
NFCmsg[0] = 0x01; NFCmsg[1] = 0x02; NFCmsg[2] = 0x03; NFCmsg[3] = 0x04;
NFCmsg[4] = 0x11; NFCmsg[5] = 0x

12; NFCmsg[6] = 0x13; NFCmsg[7] = 0x14;
NFCmsg[8] = 0x21; NFCmsg[9] = 0x22; NFCmsg[10] = 0x23; NFCmsg[11] = 0x24;
NFCmsg[12] = 0x31; NFCmsg[13] = 0x32; NFCmsg[14] = 0x33; NFCmsg[15] = 0x34;
NFCmsg[16] = 0x41; NFCmsg[17] = 0x42; NFCmsg[18] = 0x43; NFCmsg[19] = 0x44;

PSA psa;
psa = (PSA)&NFCmsg[0];

printf("\na = 0x%08x\n",psa->a);
printf("\nb = 0x%08x\n",psa->b);
int i;
for(i=0; i<4; i++)
{
printf("\nc[%d] = 0x%02x\n",i,psa->c[i]);
}
for(i=0; i<4; i++)
{
printf("\nd[%d] = 0x%02x\n",i,psa->d[i]);
}
for(i=0; i<4; i++)
{
printf("\ne[%d] = 0x%02x\n",i,psa->e[i]);
}


result:

a = 0x04030201

b = 0x14131211

c[0] = 0x21

c[1] = 0x22

c[2] = 0x23

c[3] = 0x24

d[0] = 0x31

d[1] = 0x32

d[2] = 0x33

d[3] = 0x34

e[0] = 0x41

e[1] = 0x42

e[2] = 0x43

e[3] = 0x44

conclusion:

int数据类型的a和b是以小头形式填充的数据——反,而char[]类型的c,d和e是按照原来数据存放的顺序填充的——不反。

相关主题