C语言指针操作字符数组demo
生活随笔
收集整理的这篇文章主要介绍了
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]; //16byteschar WriteCounter[RPMB_SZ_COUNTER]; //4byteschar Address[RPMB_SZ_ADDRESS]; //2byteschar BlockCount[RPMB_SZ_BLK_COUNT]; //2byteschar Result[RPMB_SZ_RESULT]; //2byteschar RequestResponse[RPMB_SZ_REQ_RESP]; //2bytes } RpmbDataFrame;为了便于跨模块调用,这里重新定义了一个新的结构体,去掉了Stuff和KeyMac字段,如下:
typedef struct { //total 288byte = 16 * 18char Hmac_Data[RPMB_SZ_DATA]; //256 byteschar Hmac_Nonce[RPMB_SZ_NONCE]; //16 byteschar Hmac_WriteCounter[RPMB_SZ_COUNTER]; //4 byteschar Hmac_Address[RPMB_SZ_ADDRESS]; //2 byteschar Hmac_BlockCount[RPMB_SZ_BLK_COUNT]; //2 byteschar Hmac_Result[RPMB_SZ_RESULT]; //2 byteschar Hmac_RequestResponse[RPMB_SZ_REQ_RESP]; //2 byteschar Hmac_Reserved[RPMB_SZ_RESERVED]; //4 bytes } HmacRpmbDataFrame;下面开始构建测试的数据,传输时可能会用到这些字段
RpmbDataFrame dataFrame;memset(&dataFrame, 0, sizeof(RpmbDataFrame));//init datamemcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytesmemcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER); //2 bytememcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT); //2 bytesmemcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes然后我们把这些初始的数据,拷贝到另一个待运算的结构体中
//copy data to HmacRpmbDataFrame structHmacRpmbDataFrame 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 positionRotInfoPoint = 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]; //16byteschar WriteCounter[RPMB_SZ_COUNTER]; //4byteschar Address[RPMB_SZ_ADDRESS]; //2byteschar BlockCount[RPMB_SZ_BLK_COUNT]; //2byteschar Result[RPMB_SZ_RESULT]; //2byteschar RequestResponse[RPMB_SZ_REQ_RESP]; //2bytes } RpmbDataFrame;typedef struct { //total 288byte = 16 * 18char Hmac_Data[RPMB_SZ_DATA]; //256 byteschar Hmac_Nonce[RPMB_SZ_NONCE]; //16 byteschar Hmac_WriteCounter[RPMB_SZ_COUNTER]; //4 byteschar Hmac_Address[RPMB_SZ_ADDRESS]; //2 byteschar Hmac_BlockCount[RPMB_SZ_BLK_COUNT]; //2 byteschar Hmac_Result[RPMB_SZ_RESULT]; //2 byteschar Hmac_RequestResponse[RPMB_SZ_REQ_RESP]; //2 byteschar Hmac_Reserved[RPMB_SZ_RESERVED]; //4 bytes } HmacRpmbDataFrame;int main(void) {printf("test hmac\n");RpmbDataFrame dataFrame;memset(&dataFrame, 0, sizeof(RpmbDataFrame));//init datamemcpy(dataFrame.Stuff, "aaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaabbbbccccddddaaaa", 196);memcpy(dataFrame.KeyMac, "hhiijjkkhhiijjkkhhiijjkkhhiijjkk", 32);memcpy(dataFrame.Data, "1111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444111122223333444411112222333344441111222233334444", 256);memcpy(dataFrame.WriteCounter, "1234", RPMB_SZ_COUNTER); //4 bytesmemcpy(dataFrame.Address, "12", RPMB_SZ_COUNTER); //2 bytememcpy(dataFrame.BlockCount, "34", RPMB_SZ_BLK_COUNT); //2 bytesmemcpy(dataFrame.RequestResponse, "56", RPMB_SZ_REQ_RESP); //2 bytes//copy data to HmacRpmbDataFrame structHmacRpmbDataFrame 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 positionRotInfoPoint = 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. $总结
以上是生活随笔为你收集整理的C语言指针操作字符数组demo的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python读取lmdb文件_如何使用p
- 下一篇: 东北大学软件项目管理与过程改进_可视化看