C语言写 char[ ] 字符串 代码解析部分遇到的结构体数组初始化 2023.4.14
内容纲要

2023.4.14

#include "stdio.h"
#include "stdint.h"
//typedef  unsigned char uint8_t;
//typedef  unsigned short uint16_t;

typedef struct {
    //uint8_t start;  // 判断第一个结构体的值是否为正常  ===== 这里没有start 字段,就目前的数据帧格式,不应该会出现它
    uint8_t len;
    uint8_t c_field;
    uint16_t m_field;  //2个字节
    //uint8_t m_field[2];  //2个字节
    uint8_t a_field[6];
    uint8_t ci_field;
    char* data[255]; //结构体中默认开启的默认缓存可能是8(long类型),所以在下方的 数据解析函数中,i>8的时候 就会栈溢出
    //uint8_t rssi;
    //uint16_t crc;
    //uint8_t stop;
} wm_data_t;

/**
 * 数据解析接口
 * @param data
 * @param item
 */
void wmbus_data_decode(const char data[], wm_data_t * item) {
    // TODO 数据解析
    // 此处的decode  用于将data 赋值到item 中,item 传入一个空的结构体参数,
    /*
    思路: 拿到len 解析出来,然后将
    char* data[] 赋值出来。
    */
    item->len = data[0];
    item->c_field = data[1];
    //item->m_field[0] = data[2];
    //item->m_field[1] = data[3];
    item->m_field = (data[2] << 8) + data[3];  // 使用左移运算符实现16进制 的拼接。

    for (size_t i = 0; i < 6; i++)
    {
        item->a_field[i] = data[4+i];
    }

    item->ci_field = data[10];

    for (size_t i = 0; i < item->len - 10; i++)
    {
        item->data[i] = data[11 + i];
    } 
}

/**
 * 打印数据内容
 * @param item
 */
void wmbus_show(wm_data_t* item) {
    short dataLen = item->len -10;
    printf("字段长度:%d \n", sizeof(*(item->data))); //2个字节

    //printf("%x\n", item->start);
    printf("len字段为:%x\n", item->len);
    printf("c_field字段:%x\n", item->c_field);

    /************** M_field 和 A_field 字段表示的是Master 发布数据的信息 ********************/
    //printf("m_field 字段的数值:%x,%x\n",item->m_field[0], item->m_field[1]);
    printf("m_field 字段的数值:%x\n",item->m_field);

    printf("a_field 字段的数值:");  
    for (int i = 0; i < sizeof(item->a_field); i++)
    {
        printf(" %x", item->a_field[i]);
    }
    printf("\n");
    /**************************************************************************************/

    printf("CI_field 字段:%d\n", item->ci_field);  // CI 控制字段,用来说明 表示出接下来的数据的架构(一层或者多层)

    // 下方打印data 数据
    printf("data: ");
    printf(" item-> dataLen = %d\n", dataLen);
    for (int i = 0;i < dataLen;i++)
    {
       printf(" %x", (item->data)[i]);
    }
    printf("\n");
}

int main() {
    char data[] = {
        0x15, 0x46, 
        0xF8, 0x02, 0xFA, 0xB2, 0x66, 0x02, 0xB6, 0xAA, // 这里是M - A 字段
        0x7A, 
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05,0x06, 0x07, 0x08, 0x09, 0x0A // data 字段
    };

    wm_data_t item = { 0 };

    wmbus_data_decode(&data, &item); // 传入地址节约空间(防止内存拷贝),
    wmbus_show(&item);
    system("pause");
    return 0;
}
  • 今天遇到的问题,在结构体中,uint16_t m_field; 这个字段会存在问题,

    • 问了chatGPT 它回复的是 ,在不同的系统环境下,可能存在大端小端的问题,就会导致 printf() 打印输出根据内存顺序的打印,就会反着打印。
    • 没找到原因的问题: uint16_t 这个字段部分,如果使用这个字段,那么 data[] 数组的第4个元素不会被打印,而是直接跳过哪个元素,实在没找到原因。
  • char * data[]; 遇到的问题,解引用之后 *data; 好像并不能获取它的数值, 这是语法问题,后面要研究

  • 结构体中,数组类型,要注意初始化的默认值,如果不给它一个值,可能默认值就是8,然后如果你在9或者之后的位置放数进去,他就会报错,stack over flow (栈溢出)

    file

    file

    file

    解决办法: 给结构体数组大爷的[]里面放一个大点的数做内存开辟的缓存,

    file

  • 学到的一点:运用左移运算符,实现16进制数据的拼接。

    file

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇