c - 处理数据缓冲区中的 header

标签 c

我有一个包含以下内容的数据缓冲区:

00000000    20 7F 3E 15 38 34 37 2E 38 33 33 36 38 32 20 2F
00000010    20 31 33 2E 30 30 35 34 31 39 20 3E 20 20 20 20    
00000020    20 3E 20 4E 4F 20 47 50 53 20 44 41 54 41 20 20
00000030    20 20 20 20 20 20 20 20 20 20 20 20

现在我想使用“真实”数据在另一个函数中处理它。

“真实”数据是前 5 个字节之后的所有内容。第五个字节,在此示例中为 0x38,是数据长度。我现在如何扫描缓冲区中的 header 0x20 0x7F 0x3E 0x15 和数据长度字节并将实际数据内容移动到另一个缓冲区或者更好,将当前缓冲区剥离为仅数据内容?

注意:我不能动态分配内存。 缓冲区大小始终为 60 字节(包括 header )。

谢谢!

最佳答案

假设原始缓冲区包含至少 5 个字节:

#define CAPACITY UINT8_MAX
uint8_t buf[CAPACITY], newbuf[CAPACITY - 5];
...
int header_is_ok = 
    (buf[0] == 0x20 && buf[1] == 0x7F && buf[2] == 0x3E && buf[3] == 0x15);

if (header_is_ok) {
    uint8_t length = buf[4];

    if (length > 0 && length < CAPACITY - 5) {
        uint8_t *contents = buf + 5;
        memcpy(newbuf, contents, length);
    }
}

一旦内容的开头和长度已知,memcpy 会将缓冲区移动到另一个位置。

关于c - 处理数据缓冲区中的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31696014/

相关文章:

c - 从 Node.js 访问 C 函数

C函数返回不打印

c++ - const char * 数组中的元素数

c - C 中一维字符串数组与二维字符串数组的比较

c - 消息队列fork + execlp + ftok的用法

无法理解 MIPS 转换为 C 时的代码顺序

c - 字符串在 C 中意外移动

c - strstr() 函数

c - 为什么在使用 extern 时可以使用错误的签名调用我的函数?

c - 通过/dev/mem读写进程内存,text段可以,data段不行,为什么?