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
- 下一篇: 微软欲2012年拿下智能手机系统四成市场