C语言指针操作字符数组demo

C语言指针操作字符数组demo,本意是使用指针操作source,函数调用一次取16个字节,调用两次获取到整个数据。

char source[32] = {0};
int *header = (int *)source;
int *pos = (int *)source;

void print_value(int *arg0, int *arg1, int *arg2, int *arg3)
{
	if (  4 * (pos - header) >= 32)
		pos = header;
	*arg0 = *pos;
	pos++;
	*arg1 = *pos;
	pos++;
	*arg2 = *pos;
	pos++;
	*arg3 = *pos;
	pos++;

	printf("arg0:%x, arg1:%x, arg2:%x, arg3:%x\n", *arg0, *arg1, *arg2, *arg3);
}

int main(void) {
	memcpy(source, "11223344112233445566778855667788", 32);

	printf("sourceData is:\n");
	for (int i = 0; i < 32; i++)
	{
		printf("%x", source[i]);
	}
	printf("\n");

	printf("Result:\n");
	
	int arg0;
	int arg1;
	int arg2;
	int arg3;
	
	char data[32] = {0};
	for (int j = 0; j < 2; j++)
	{
		print_value(&arg0, &arg1, &arg2, &arg3);
	}

	printf("print again.\n");
	for (int j = 0; j < 2; j++)
	{
		print_value(&arg0, &arg1, &arg2, &arg3);
	}
}

运行结果:

$ ./test
sourceData is:
3131323233333434313132323333343435353636373738383535363637373838
Result:
arg0:32323131, arg1:34343333, arg2:32323131, arg3:34343333
arg0:36363535, arg1:38383737, arg2:36363535, arg3:38383737
print again.
arg0:32323131, arg1:34343333, arg2:32323131, arg3:34343333
arg0:36363535, arg1:38383737, arg2:36363535, arg3:38383737
$ 

===================================================
下面是稍微变化点的操作,
需求是这样的:操作RPMB的data_frame长度是512字节,写入数据时需要计算数据的hmac,但是计算hmac是从data_frame结构体去掉stuff和keymac后数据。

RPMB data_frame的结构体定义如下:

#define RPMB_SZ_STUFF		  196
#define RPMB_SZ_MAC		      32
#define RPMB_SZ_DATA		  256
#define RPMB_SZ_NONCE		  16
#define RPMB_SZ_COUNTER       4
#define RPMB_SZ_ADDRESS       2
#define RPMB_SZ_BLK_COUNT     2
#define RPMB_SZ_RESULT        2
#define RPMB_SZ_REQ_RESP      2
#define RPMB_SZ_RESERVED      4

#define HMAC_DATALEN 
#define HMAC_COUNT(x) (x + 1)

typedef struct {
  char Stuff[RPMB_SZ_STUFF];
  char KeyMac[RPMB_SZ_MAC];
  char Data[RPMB_SZ_DATA];
  char Nonce[RPMB_SZ_NONCE];               //16bytes
  char WriteCounter[RPMB_SZ_COUNTER];      //4bytes
  char Address[RPMB_SZ_ADDRESS];           //2bytes
  char BlockCount[RPMB_SZ_BLK_COUNT];      //2bytes
  char Result[RPMB_SZ_RESULT];             //2bytes
  char RequestResponse[RPMB_SZ_REQ_RESP];  //2bytes
} RpmbDataFrame;

为了便于跨模块调用,这里重新定义了一个新的结构体,去掉了Stuff和KeyMac字段,如下:

typedef struct {                                //total 288byte = 16 * 18
  char Hmac_Data[RPMB_SZ_DATA];                 //256 bytes
  char Hmac_Nonce[RPMB_SZ_NONCE];               //16  bytes
  char Hmac_WriteCounter[RPMB_SZ_COUNTER];      //4   bytes
  char Hmac_Address[RPMB_SZ_ADDRESS];           //2   bytes
  char Hmac_BlockCount[RPMB_SZ_BLK_COUNT];      //2   bytes
  char Hmac_Result[RPMB_SZ_RESULT];             //2   bytes
  char Hmac_RequestResponse[RPMB_SZ_REQ_RESP];  //2   bytes
  char Hmac_Reserved[RPMB_SZ_RESERVED];         //4   bytes
} HmacRpmbDataFrame;

下面开始构建测试的数据,传输时可能会用到这些字段

	RpmbDataFrame dataFrame;
	memset(&dataFrame, 0, sizeof(RpmbDataFrame));
	
	//init data
	memcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);
	memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);
	memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);
	memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytes
	memcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER);        //2 byte
	memcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT);   //2 bytes
	memcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes

然后我们把这些初始的数据,拷贝到另一个待运算的结构体中

	//copy data to HmacRpmbDataFrame struct
	HmacRpmbDataFrame hmacRpmbData;
	memset(&hmacRpmbData, 0, sizeof(HmacRpmbDataFrame));
	memcpy(hmacRpmbData.Hmac_Data, dataFrame.Data, RPMB_SZ_DATA);
	memcpy(hmacRpmbData.Hmac_Nonce, dataFrame.Nonce, RPMB_SZ_NONCE);
	memcpy(hmacRpmbData.Hmac_WriteCounter, dataFrame.WriteCounter, RPMB_SZ_COUNTER);
	memcpy(hmacRpmbData.Hmac_Address, dataFrame.Address, RPMB_SZ_ADDRESS);
	memcpy(hmacRpmbData.Hmac_BlockCount, dataFrame.BlockCount, RPMB_SZ_BLK_COUNT);
	memcpy(hmacRpmbData.Hmac_Result, dataFrame.Result, RPMB_SZ_RESULT);
	memcpy(hmacRpmbData.Hmac_RequestResponse, dataFrame.RequestResponse, RPMB_SZ_REQ_RESP);

接下来的跨模块传输需求是一次只能发送16个字节,函数有四个参数,每个参数4个字节。

	int *RotInfoPoint = (int *)&hmacRpmbData;
	int *RotInfoPointHeader = (int *)&hmacRpmbData;
	int arg0, arg1, arg2, arg3;

	for (int i = 0; i < 18; i++) //284 bytes ,18*16 = 288
	{
		arg0 = *RotInfoPoint;
		RotInfoPoint++;
		arg1 = *RotInfoPoint;
		RotInfoPoint++;
		arg2 = *RotInfoPoint;
		RotInfoPoint++;
		arg3 = *RotInfoPoint;
		RotInfoPoint++;
		
		printf("[%d] arg0:0x%x, arg1:0x%x, arg2:0x%x, arg3:0x%x\n",
			i+1, arg0,arg1,arg2,arg3);
	}
	
	//reset point to header position
	RotInfoPoint = RotInfoPointHeader;

完整demo Code:

#define RPMB_SZ_STUFF		  196
#define RPMB_SZ_MAC		      32
#define RPMB_SZ_DATA		  256
#define RPMB_SZ_NONCE		  16
#define RPMB_SZ_COUNTER       4
#define RPMB_SZ_ADDRESS       2
#define RPMB_SZ_BLK_COUNT     2
#define RPMB_SZ_RESULT        2
#define RPMB_SZ_REQ_RESP      2
#define RPMB_SZ_RESERVED      4

#define HMAC_DATALEN 
#define HMAC_COUNT(x) (x + 1)

typedef struct {
  char Stuff[RPMB_SZ_STUFF];
  char KeyMac[RPMB_SZ_MAC];
  char Data[RPMB_SZ_DATA];
  char Nonce[RPMB_SZ_NONCE];               //16bytes
  char WriteCounter[RPMB_SZ_COUNTER];      //4bytes
  char Address[RPMB_SZ_ADDRESS];           //2bytes
  char BlockCount[RPMB_SZ_BLK_COUNT];      //2bytes
  char Result[RPMB_SZ_RESULT];             //2bytes
  char RequestResponse[RPMB_SZ_REQ_RESP];  //2bytes
} RpmbDataFrame;

typedef struct {                                //total 288byte = 16 * 18
  char Hmac_Data[RPMB_SZ_DATA];                 //256 bytes
  char Hmac_Nonce[RPMB_SZ_NONCE];               //16  bytes
  char Hmac_WriteCounter[RPMB_SZ_COUNTER];      //4   bytes
  char Hmac_Address[RPMB_SZ_ADDRESS];           //2   bytes
  char Hmac_BlockCount[RPMB_SZ_BLK_COUNT];      //2   bytes
  char Hmac_Result[RPMB_SZ_RESULT];             //2   bytes
  char Hmac_RequestResponse[RPMB_SZ_REQ_RESP];  //2   bytes
  char Hmac_Reserved[RPMB_SZ_RESERVED];         //4   bytes
} HmacRpmbDataFrame;

int main(void) {
	printf("test hmac\n");
	RpmbDataFrame dataFrame;
	memset(&dataFrame, 0, sizeof(RpmbDataFrame));
	
	//init data
	memcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);
	memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);
	memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);
	memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytes
	memcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER);        //2 byte
	memcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT);   //2 bytes
	memcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes


	//copy data to HmacRpmbDataFrame struct
	HmacRpmbDataFrame hmacRpmbData;
	memset(&hmacRpmbData, 0, sizeof(HmacRpmbDataFrame));
	memcpy(hmacRpmbData.Hmac_Data, dataFrame.Data, RPMB_SZ_DATA);
	memcpy(hmacRpmbData.Hmac_Nonce, dataFrame.Nonce, RPMB_SZ_NONCE);
	memcpy(hmacRpmbData.Hmac_WriteCounter, dataFrame.WriteCounter, RPMB_SZ_COUNTER);
	memcpy(hmacRpmbData.Hmac_Address, dataFrame.Address, RPMB_SZ_ADDRESS);
	memcpy(hmacRpmbData.Hmac_BlockCount, dataFrame.BlockCount, RPMB_SZ_BLK_COUNT);
	memcpy(hmacRpmbData.Hmac_Result, dataFrame.Result, RPMB_SZ_RESULT);
	memcpy(hmacRpmbData.Hmac_RequestResponse, dataFrame.RequestResponse, RPMB_SZ_REQ_RESP);


	int *RotInfoPoint = (int *)&hmacRpmbData;
	int *RotInfoPointHeader = (int *)&hmacRpmbData;
	int arg0, arg1, arg2, arg3;

	for (int i = 0; i < 18; i++) //284 bytes ,18*16 = 288
	{
		arg0 = *RotInfoPoint;
		RotInfoPoint++;
		arg1 = *RotInfoPoint;
		RotInfoPoint++;
		arg2 = *RotInfoPoint;
		RotInfoPoint++;
		arg3 = *RotInfoPoint;
		RotInfoPoint++;
		
		printf("[%d] arg0:0x%x, arg1:0x%x, arg2:0x%x, arg3:0x%x\n",
			i+1, arg0,arg1,arg2,arg3);
	}
	
	//reset point to header position
	RotInfoPoint = RotInfoPointHeader;
	printf("test hmac done.\n");
}

运行结果:

$ ./test
test hmac
[1] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[2] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[3] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[4] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[5] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[6] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[7] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[8] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[9] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[10] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[11] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[12] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[13] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[14] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[15] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[16] arg0:0x31313131, arg1:0x32323232, arg2:0x33333333, arg3:0x34343434
[17] arg0:0x0, arg1:0x0, arg2:0x0, arg3:0x0
[18] arg0:0x34333231, arg1:0x34333231, arg2:0x36350000, arg3:0x0
test hmac done.
$ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值