C语言中结构体与字符数组之间的相互转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(push)
#pragma pack(1) 
typedef struct strcChange
{
	unsigned int B;
	unsigned short C;
	unsigned char A;
}STRU_CHANGE;
#pragma pack(pop)

/*如果在未加字节对齐的情况下,那么A变量的后面需要自动填充三个字节,
那么直接将结构体取地址后复制到另一个数组中,实际上所需占用的内存大
小是8个byte。*/

int main()
{
	int i;
	STRU_CHANGE strChangeData1;
	STRU_CHANGE strChangeData2;
	STRU_CHANGE strChangeData3;
	STRU_CHANGE * pstrChangeData1;
	unsigned char * pucData;
	char C[10];
	
	strChangeData2.A = 0x11;
	strChangeData2.B = 0x55443322;
	strChangeData2.C = 0x000b;
	pucData = (unsigned char *)(&strChangeData2);
	printf("pucData[0] = 0x%x\n", pucData[0]);
	printf("pucData[1] = 0x%x\n", pucData[1]);
	printf("pucData[2] = 0x%x\n", pucData[2]);
	printf("pucData[3] = 0x%x\n", pucData[3]);
	printf("pucData[4] = 0x%x\n", pucData[4]);
	printf("pucData[4] = 0x%x\n", pucData[5]);
	printf("pucData[4] = 0x%x\n", pucData[6]);
	
	/*结构体转字符串*/
	strChangeData1.A = 0x01;
	strChangeData1.B = 0x05040302;
	strChangeData1.C = 0x000a;
	memcpy(C, &strChangeData1, sizeof(strChangeData1)); 
	for(i = 0; i < strlen(C); i++)
	{
		printf("C %x\n", C[i]);
	}
	
	/* 字符串转结构体*/
	pstrChangeData1 = (STRU_CHANGE *)C; 
	printf("STRU_CHANGE.A = 0x%x\n", pstrChangeData1->A);
	printf("STRU_CHANGE.B = 0x%08x\n", pstrChangeData1->B);
	printf("STRU_CHANGE.C = 0x%04x\n", pstrChangeData1->C);
	/* 字符串转结构体*/
	memcpy(&strChangeData3, C, sizeof(C));
	printf("STRU_CHANGE.A = 0x%x\n", strChangeData3.A);
	printf("STRU_CHANGE.B = 0x%08x\n", strChangeData3.B);
	printf("STRU_CHANGE.C = 0x%04x\n", strChangeData3.C);
	
	return 0;
}



root@ubuntu:/home/share/test# ./app 
pucData[0] = 0x22
pucData[1] = 0x33
pucData[2] = 0x44
pucData[3] = 0x55
pucData[4] = 0xb
pucData[4] = 0x0
pucData[4] = 0x11
C 2
C 3
C 4
C 5
C a
STRU_CHANGE.A = 0x1
STRU_CHANGE.B = 0x05040302
STRU_CHANGE.C = 0x000a
STRU_CHANGE.A = 0x1
STRU_CHANGE.B = 0x05040302
STRU_CHANGE.C = 0x000a

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值