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相关推荐

  1. C语言补漏:字符串指针与字符数组传参

    字符串指针与字符数组传参 深信服的笔试上被吊打,其中对一道用指针做形参的题目印象十分深刻,借此恶补了一晚上指针,今天总结,以作警示. ​ 试想有如下情形,将一个字符串指针做形参赋值函数修改其字符串,函 ...

  2. C语言指针操作(四)通过指针引用字符串

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 前言​编辑 一.字符串的引用方式 例1 例2 二.字符指针作函数参数 用函数调用实现字符串的 ...

  3. c语言中定义字母二维数组,C语言中二维字符数组

    C语言中二维字符数组的定义和初始化 一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它.比如说: Code: 1.char testcase[30][MAX_LENG ...

  4. c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)

    浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...

  5. (C/C++学习)15.C语言字符串和字符数组

    说明:在C语言中字符串和字符数组有很多相似之处,却又有着一些不同.本文将针对其区别与联系,进行分析总结. 一.字符串 1.在C语言中,字符串是由双引号括起来的任意字符序列,如:"china& ...

  6. C语言指针操作(一)指针变量

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 前言 一.指针的概念 二.指针变量 例 注意 1.怎样定义指针变量 2.怎样引用指针变量 注 ...

  7. C语言字符串与字符数组

    C语言字符串与字符数组 1. 字符串与字符数组 1.1 C 语言字符串 什么是字符串? 通俗的讲字符串是由一串字符组成,例如 "Hello World\n",即是一个字符串. C ...

  8. C语言中关于字符数组输入,scanf没执行

    问题:有时C语言中关于字符数组输入,有的scanf语句没执行. 未执行scanf的代码: #include<stdio.h> int main() {int n;int t=0;scanf ...

  9. 三串合一(指针与字符数组)

    三串合一(指针与字符数组) 题目描述 输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串 要求: 三个字符串的创建和输入可以使用数组,也可以不用 ...

最新文章

  1. python app教程-Python zipapp打包教程(超级详细)
  2. 异常宕机 Ora-00600 [Kccpb_sanity_check_2] 错误解决方法
  3. Training little cats
  4. IntelliJ IDEA scala的源码设置
  5. Jquery ajax 访问调用带参数的服务方法!
  6. Tabcontrol动态添加TabPage(获取或设置当前选项卡及其属性)
  7. 使用log4j2免费分配日志记录
  8. getallheaders函数在服务器报500错误_「干货」服务器性能优化的8种常用方法
  9. python如何叉乘_向量点乘与向量叉乘
  10. ThinkPHP---案例1登录登出和添加部门
  11. MAP地图报错Unable to preventDefault inside passive event listener invocation.
  12. WPS如何并排放置两张图片_Animate如何制作文字动图动画
  13. linux 下 pip 安装教程
  14. BurpSuite 1.6~2.x版本汉化版工具
  15. linux安装8723网卡驱动,deepin 系统 安装 Realtek RTL8723BE 网卡驱动
  16. 采样频率在频谱分析中的理解
  17. Less系列之混合(Mixins)
  18. MAC直接的剪切快捷键
  19. 实验五 汉字字库实验(Logisim)
  20. windows 网络正常 浏览器却打不开网页解决办法

热门文章

  1. C语言嵌入式系统编程修炼之内存操作
  2. HR怼程序员频繁跳槽,程序员竟这么回怼
  3. mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等...
  4. virtualbox安装ubuntu_virtualBox使用 Ubuntu18.0.4
  5. STM32----摸石头过河系列(四)
  6. ComplexHeatmap |理解绘图逻辑绘制热图
  7. 哈佛大学单细胞课程|笔记汇总 (五)
  8. 生信分析过程中这些常见文件的格式以及查看方式你都知道吗?
  9. 安装cleanmymac软件提示已损坏无法打开,如何解决?
  10. 界址点圆圈怎么生成_大千世界怎么钓鱼?大千世界钓鱼方法及灵气之水获取攻略...