首页 > 解决方案 > 在 C 中使用可变长度数组解析固定大小的消息

问题描述

我的 C 程序必须解析这样的固定长度消息:

uint8_t message[8] = {80, 75, 73, 71, 1, 1, 1, 1};

另一条消息可能是:

uint8_t message[8] = {80, 75, 73, 71, 41, 42, 1, 1};

该消息包含一个 ASCII 字符串,1 表示字符串的结尾。所以第一条消息的实际长度是4,第二条消息是6。

我使用这种方法来提取消息:

1. Counting the message length
2. Initializing a variable length array with this value.
3. Using memcpy to copy the bytes.

代码片段

在库文件中:

计算长度:

...
#define LENGTH 100
// Global variables in library
uint8_t message[LENGTH];
uint8_t parsed_message[LENGTH];
uint8_t len = 0;
...

for (int i = 0; i < LENGTH; i++)
    {
        if (message[i] != 1)
        {
            parsed_message[i] = message[i];
            len++;
        }
        else
        {
            parsed_message[i] = '\0';
            len++;
            break;
        }

    }

吸气剂功能:

void get_address(char * addr, int size)
{
    memcpy(addr, message, size);
}


uint8_t get_size(void)
{
    return len;
}

在主函数中:

char addr[get_size()];
get_address(addr, get_size());
printf("==== %s ==== ADDRESS\n", addr);

[我在片段中省略了大小和空值检查]

我在基于 ARM 的 32 位微控制器中使用 GCC 编译器和 C99 标准。

我的问题是这种方法安全吗?或者我应该使用另一种方法。

标签: c

解决方案


在您将其发送到该程序的消息中包含一个保存实际字节数的字节,然后使用该计数字节进行操作。


推荐阅读