使用struct指针强制转换int和char[]时产生的大小头问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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是按照原来数据存放的顺序填充的——不反。