c - 在 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 标准。
我的问题是这种方法安全吗?或者我应该使用另一种方法。
解决方案
在您将其发送到该程序的消息中包含一个保存实际字节数的字节,然后使用该计数字节进行操作。
推荐阅读
- sql - 如何为每一行编写一个加入日期时间的 SQL 查询
- c# - 解密 AES/OFB/NoPadding
- ios - ARKit 在 ARWorldTrackingConfiguration 和 ARFaceTrackingConfiguration 之间切换 - 后置和前置摄像头
- excel - 过滤过滤后的唯一数据并将其复制到另一个工作表;工作表名称将是唯一值
- python - 用于与 Python/Pandas 中的列中的先前值进行成对比较的循环
- c - 如何使用 RS485 将数据传输到 BeagleBone Black
- python - 如何从网页获取时钟
- javascript - 更改现有加载的 jquery
- java - spring 如何在属性文件中设置占位符值
- javascript - Nodejs setInterval 每 30 秒重复一次任务