C语言随笔小算法:char字节流与结构体变量相互转换

代码:

/*
**数据域
*/
typedef struct
{kal_uint8 bt_dpacket_data_total_num;       //(可省略)数据项个数kal_uint8 bt_dpacket_data_serial_num;       //数据项编号kal_uint8 bt_dpacket_data_len;               //对应的数据项长度kal_uint8 bt_dpacket_data_content[2];     //数据项内容
} STRUCT_BT_DPACKET_DATA;/*
**蓝牙数据包解码出来的数据
**对应的结构体缓存字段,
*/
typedef struct
{kal_uint8 bt_dpacket_decoder_type;                     //控制类型      1BYTEkal_uint8 bt_dpacket_decoder_imei[8];                  //IMEI              8BYTEkal_uint8 bt_dpacket_decoder_ctrl_code;                    //控制码           1BYTEkal_uint8 bt_dpacket_decoder_cmd;                      //命令码           1BYTEkal_uint8 bt_dpacket_decoder_datalen[2];               //数据域长度 2BYTESTRUCT_BT_DPACKET_DATA bt_dpacket_decoder_content;     //数据域           5BYTEkal_uint8 bt_dpacket_decoder_crc16[2];                 //校验码           2BYTE
} STRUCT_BT_DPACKET_DECODER_DATA;/*控制器类型对应编号*/typedef enum
{ctrler_begin = 0,                 //保留ctrler_simple = 1,                 //普通定位ctrler_high_precision = 2,           //高精度定位ctrler_simple_lock = 3,             //普通定位+锁车ctrler_high_precision_lock = 4,      //高精度定位+锁车ctrler_simple_lock_bt = 5,          //普通定位+ 锁车ctrler_high_precision_lock_bt = 6,  //高精度定位+锁车+btctrler_NUM_MAX
} enum_bt_diag_ctrler_type;/*
*把字节流按照结构体样式解析出来
*返回结构体成员
*/
STRUCT_BT_DPACKET_DECODER_DATA* Track_cust_bt_dpacket_decoder
(void* recv_data
)
{kal_uint32 pre_index = 0;kal_uint32 next_index = 0;kal_uint8  *tem_recv_data = (kal_uint8*) recv_data;STRUCT_BT_DPACKET_DECODER_DATA decoder_data_ex = {0};STRUCT_BT_DPACKET_DECODER_DATA* decoder_data = &decoder_data_ex;//kal_uint8  val[5] = {0};kal_uint8  *data_content = (kal_uint8 *)malloc(sizeof(STRUCT_BT_DPACKET_DATA));//kal_uint8 index_total_num = 0;//kal_uint8 index_serial_num = 0;//kal_uint8 index_data_len = 0;if(data_content == NULL){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,内存分配失败!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,内存分配失败!", __FUNCTION__);
#endifreturn;}//控制器类型1BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_type);memcpy((kal_uint8*)(&(decoder_data->bt_dpacket_decoder_type)), (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_type=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_type);kal_prompt_trace(MOD_TST, "%s,decoder_data->bt_dpacket_decoder_type=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_type);
#endif//IMEI    8BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_imei);memcpy(decoder_data->bt_dpacket_decoder_imei, (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_imei=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_imei);
#endif//控制码         1BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_ctrl_code);memcpy(&decoder_data->bt_dpacket_decoder_ctrl_code, (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_ctrl_code);
#endif//命令码         1BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_cmd);memcpy(&decoder_data->bt_dpacket_decoder_cmd, (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_cmd=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_cmd);
#endif//数据域长度   2BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_datalen);memcpy(decoder_data->bt_dpacket_decoder_datalen, (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_datalen=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_datalen);
#endif//数据域         5BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_content);memcpy(data_content, (kal_uint8*)(tem_recv_data + pre_index), next_index);//数据域结构体单独处理decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_total_num = \data_content[0];decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_serial_num = data_content[1];decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_len = data_content[2];memcpy(decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_content, (kal_uint8*)(data_content + 3), \sizeof(decoder_data->bt_dpacket_decoder_content.bt_dpacket_data_content));pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_content=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_content);
#endif//校验码         2BYTEnext_index = sizeof(decoder_data->bt_dpacket_decoder_crc16);memcpy(decoder_data->bt_dpacket_decoder_crc16, (kal_uint8*)(tem_recv_data + pre_index), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \decoder_data->bt_dpacket_decoder_crc16);
#endiffree(data_content);return decoder_data;
}/*
** 解析蓝牙数据包ysheng
*/
STRUCT_BT_DPACKET_DECODER_DATA Track_cust_decode_bt_dpacket
(void* recv_data
)
{kal_uint32 recv_data_len = 0;//STRUCT_BT_DPACKET_DECODER_DATA decoder_data_ex = {0};STRUCT_BT_DPACKET_DECODER_DATA *decoder_data = NULL;//&decoder_data_ex;BOOL         crc16_ret = FALSE;#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "Entry-->>%s", __FUNCTION__);kal_prompt_trace(MOD_TST, "Entry-->>%s", __FUNCTION__);
#endif//1.判断接收到的数据是否为空if((kal_uint8*) recv_data == NULL){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,recv_data为空!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,recv_data为空!", __FUNCTION__);
#endifreturn;}/*2.先把数据解析出来,赋值给结构体变量*/decoder_data = Track_cust_bt_dpacket_decoder((kal_uint8*)recv_data);if(decoder_data == NULL){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,decoder_data为空,数据解析出错!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,decoder_data为空,数据解析出错!", __FUNCTION__);
#endifreturn;}/**3.crc16校验码,校验码是16位的话,**则后两个字节为校验码*///crc16_ret = IsCrc16Good((const U8*)(decoder_data->bt_dpacket_decoder_crc16),sizeof(decoder_data->bt_dpacket_decoder_crc16));//if(!crc16_ret)//{
#if defined(TRACK_CUST_TRACE_BT_DPACKET)//LOGD(L_OS, L_V5, "%s,蓝牙诊断解析包crc16校验失败!",__FUNCTION__);//kal_prompt_trace(MOD_TST, "%s,蓝牙诊断解析包crc16校验失败!",__FUNCTION__);
#endif//return;//}/*4.判断控制器类型是否为ctrler_simple_lock_btctrler_high_precision_lock_bt*/if((decoder_data->bt_dpacket_decoder_type != ctrler_simple_lock_bt)\&& (decoder_data->bt_dpacket_decoder_type != ctrler_high_precision_lock_bt)){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,蓝牙诊断:终端不支持蓝牙功能!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,蓝牙诊断:终端不支持蓝牙功能!", __FUNCTION__);
#endifreturn;}/*5.判断命令码是否为01H或者02H,因为蓝牙只有这两种任务序号*/if(decoder_data->bt_dpacket_decoder_cmd != 1\&& decoder_data->bt_dpacket_decoder_cmd != 2){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,蓝牙诊断:无此任务序号!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,蓝牙诊断:无此任务序号!", __FUNCTION__);
#endifreturn;}/*其余解析出来的参数,**暂时不在这里面判断了!**注意,APP发送过来的包数据域的数据内容为应该为空*/return *decoder_data;}/*将结构体转化为字节流
**输入:packet_data
**输出:sendData
*/
void Track_cust_bt_dpacket_encoder(kal_uint8 *sendData,STRUCT_BT_DPACKET_DECODER_DATA *packet_data
)
{kal_uint8 pre_index = 0;kal_uint8 next_index = 0;//kal_uint8 tmp_content[5] = {0};//kal_uint8 *data_content = tmp_content;kal_uint8  *data_content = (kal_uint8 *)malloc(sizeof(STRUCT_BT_DPACKET_DATA));if(data_content == NULL){
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,内存分配失败!", __FUNCTION__);kal_prompt_trace(MOD_TST, "%s,内存分配失败!", __FUNCTION__);
#endifreturn;}//1.控制器类型打包 1Bnext_index = sizeof(packet_data->bt_dpacket_decoder_type);memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_type)), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_crc16);
#endif//2.IMEI 8Bnext_index = sizeof(packet_data->bt_dpacket_decoder_imei);memcpy(sendData + pre_index, (kal_uint8*)(packet_data->bt_dpacket_decoder_imei), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_imei=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_imei);
#endif//3.控制码 1Bnext_index = sizeof(packet_data->bt_dpacket_decoder_ctrl_code);memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_ctrl_code)), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_ctrl_code);
#endif//4.命令码 1Bnext_index = sizeof(packet_data->bt_dpacket_decoder_cmd);memcpy(sendData + pre_index, (kal_uint8*)(&(packet_data->bt_dpacket_decoder_cmd)), next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_ctrl_code=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_ctrl_code);
#endif//5.数据长度 1Bnext_index = sizeof(packet_data->bt_dpacket_decoder_datalen);memcpy(sendData + pre_index, (kal_uint8*)packet_data->bt_dpacket_decoder_datalen, next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_datalen=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_datalen);
#endif//6.数据域5Bnext_index = sizeof(packet_data->bt_dpacket_decoder_content);data_content[0] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_total_num;data_content[1] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_serial_num;data_content[2] = packet_data->bt_dpacket_decoder_content.bt_dpacket_data_len;memcpy((kal_uint8*)(data_content + 3), (kal_uint8*)packet_data->bt_dpacket_decoder_content.bt_dpacket_data_content, \sizeof(packet_data->bt_dpacket_decoder_content.bt_dpacket_data_content));memcpy(sendData + pre_index, (kal_uint8*)data_content, next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_content=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_content);
#endif//7.校验码5Bnext_index = sizeof(packet_data->bt_dpacket_decoder_crc16);memcpy(sendData + pre_index, (kal_uint8*)packet_data->bt_dpacket_decoder_crc16, next_index);pre_index += next_index;
#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "%s,packet_data->bt_dpacket_decoder_crc16=%d", __FUNCTION__, \packet_data->bt_dpacket_decoder_crc16);
#endiffree(data_content);return;
}/*
**  封装蓝牙数据包,
**  将结构体转为字节流
**  ysheng
*/
kal_uint8 * Track_cust_encode_bt_dpacket(STRUCT_BT_DPACKET_DECODER_DATA *packet_data)
{kal_uint8 len = sizeof(STRUCT_BT_DPACKET_DECODER_DATA);kal_uint8 tem_send_data[20] = {0};//函数返回指针的话,不能用动态分配内存...kal_uint8 *sendData = tem_send_data;//(kal_uint8*)malloc(len);#if defined(TRACK_CUST_TRACE_BT_DPACKET)LOGD(L_OS, L_V5, "Entry-->>%s", __FUNCTION__);kal_prompt_trace(MOD_TST, "Entry-->>%s", __FUNCTION__);
#endif//格式化打包Track_cust_bt_dpacket_encoder(sendData, packet_data);/*以下判断senddata是否有效数据包,**且是否加包头保卫及crc16编码*/{//crc16编码}//free(sendData);return sendData;
}void main(void)
{int i, val = 0;STRUCT_BT_DPACKET_DECODER_DATA  tmp_data = {0};kal_uint8 *tem_send_data = 0;kal_uint8 recv_data[20] ={0x05,         // 控制器类型//05    23    43         26        78        34         98         26   开头0需要特殊处理0x05, 0x17, 0x2b, 0x1a, 0x4e, 0x22, 0x62, 0x1a, //IMEI0x86,            //控制码0x01,          //命令码01/020x00, 0x67,   //数据长度1030x01,          //数据项个数0x01,            //数据项编号0x03,            //数据项长度0x00, 0x01,  //数据项内容0xac, 0xd2       //crc16};//接口验证tmp_data = Track_cust_decode_bt_dpacket(recv_data);tem_send_data = Track_cust_encode_bt_dpacket(&tmp_data);for(i = 0; i < 20; i++){val = tem_send_data[i];}}

C语言随笔小算法:char字节流与结构体变量相互转换相关推荐

  1. C语言随笔小算法:创建双向链表

    C语言随笔小算法:创建双向链表 双向链表两个指针域!head定住,tail移动! 代码: #include "stdlib.h" #include "stdio.h&qu ...

  2. C语言随笔小算法:单向链表

    C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...

  3. C语言随笔小算法:单项链表如何实现队列

    C语言随笔小算法:单项链表如何实现队列 参考链接: https://blog.csdn.net/u012895183/article/details/81914767 代码:

  4. C语言随笔小算法:取出一个任意整数的每一位数值

    C语言随笔小算法:取出一个任意整数的每一位数值 代码: #include "stdlib.h" #include "stdio.h"//将val的各位取出来 i ...

  5. c语言一些算法解题技巧,c语言常见小算法的解题思路.doc

    c语言常见小算法的解题思路 判定某一年是否是闰年 闰年时间:四年一闰,百年不闰,四百年再闰.,其中 大写字母转小写字母 大写字母+32 = 小写字母 A = 65 a = 97 输入一个华氏温度,要求 ...

  6. 【零基础学C语言】知识总结八:struct 结构体与 union 共用体

    struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...

  7. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  8. 用字典存储学生成绩查询_C语言 | 用结构体变量存储学生信息

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  9. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

最新文章

  1. 提高 GPU 训练利用率的Tricks
  2. 声明与已声明不兼容_中兴今日发声明:专注芯片设计 不具备芯片制造能力
  3. input添加disabled属性出现的移动端兼容问题
  4. VMware8.0虚拟机中安装Ubuntu12.04使用NAT设置连接网络
  5. Log4j详细设置说明
  6. 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树
  7. 算法-字符串 循环左移
  8. php调用go微服务,基于go搭建微服务实践教程 (一)
  9. java下载文件接口
  10. week15——作业(字符串,完结撒花)
  11. 根轨迹起始角与终止角的确定
  12. 海思lowlevel_init.S简单分析
  13. 引流三十六招第十四招:蹭热门工具流量,日引上千精准粉
  14. 所有网站都通用的自定义弹出框alert
  15. linux kernel X-tranx-Y : Ethernet-to-Gadget
  16. 使用RecyclerView实现瀑布流,仿照小红书,解决顶部留白、卡顿等问题
  17. 什么是Vue CLI(脚手架)?
  18. 去了北京大兴机场后,我果断抛弃首都机场,去北京,首选大兴
  19. Java语言程序设计(郎波) 笔记(一)
  20. 大数据平台关键功能设计

热门文章

  1. kafka基本概念和hello world搭建
  2. DropDownList第一个默认值
  3. iOS之网络数据下载和JSON解析
  4. 性能测试知多少---吞吐量【转】
  5. CImage类 from http://blog.sina.com.cn/s/blog_487547aa0100an6k.html
  6. WPF/Sliverlight ScrollViewer与Panel(2)
  7. K8S实战之环境部署1.18(一)
  8. Zabbix 4.2.5 安装部署实践详解
  9. Windows下的良心软件
  10. Eclipse、VBA、IE开发者工具 Debug快捷键