c - 在静态数组中存储二进制数据

标签 c buffer

我正在编写一个从 UART 接口(interface)读取数据的应用程序。数据以数据包的形式发送。每个数据包都有一个与其关联的 channel 。我的应用程序将接收到的数据包复用到虚拟 channel (线程)中,以便每个 channel 都可以彼此独立工作。当我收到一个数据包时,我必须根据它的内容做一些事情并产生响应。使用相同的 UART 接口(interface)发回响应。

发送的数据大部分是二进制的。当我从 UART 接口(interface)读取数据时,我事先知道数据包的大小,因此我可以毫无问题地预分配内存。

对我来说,问题是如何做出回应。我知道数据包的最大大小,因此我可以在构建响应时创建静态缓冲区。如果我要使用 ASCII 字符而不是二进制数据,我可以依靠 NULL 终止符来确定缓冲区中存储的数据的长度。但是,我正在处理二进制数据,因此使用 NULL 字节不起作用。相反,我必须保留一个变量来存储已用完的缓冲区的字节数。我正在考虑使用自定义数据类型来存储二进制数据:

typedef struct {
    unsigned char buff[2048];
    size_t buff_used;
} binary_data_t;

处理这个问题的标准方法是什么?

最佳答案

由于您知道保存数据包所需的字节数,因此只需使用 flexible array member :

typedef struct
{
    size_t bytes;
    unsigned char data[];
} binary_data_t;

(请注意 identifiers ending in _t are reserved by POSIX ,你真的不应该使用它们。)

分配和读取数据(假设您从文件描述符read()):

binary_data_t *p = malloc( sizeof( *p ) + numDataBytes );
p->bytes = numDataBytes;
ssize_t bytes_read = read( uartFD, p->data, numDataBytes );

关于c - 在静态数组中存储二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47552387/

相关文章:

编译器行为?

c - C 循环问题中墙上的啤酒

go - 使用多个扫描仪时,scanner.Scan()的顺序出现问题

c++ - 在 C++ 中的多个程序之间本地共享数据(如套接字)

node.js - Nodejs 在缓冲区和字符串之间转换图像

C 字符串操作(切割一些特殊的 char* 尾部)

c++ - 调用 posix_spawn 时关闭所有文件句柄

c++ - 如何在 C++ 中将结构写入文件并读取文件?

c - flushall() 不起作用 - 在 C 中

C程序显示从用户输入的3个数字中的最大和最小数字