在静态数组中存储二进制数据
Storing binary data in static array
我正在编写一个从 UART 接口读取数据的应用程序。数据以数据包的形式发送。每个数据包都有一个与之关联的通道。我的应用程序将接收到的数据包多路复用到虚拟通道(线程)中,以便每个通道都可以独立工作。当我收到一个数据包时,我必须根据它的内容做一些事情并产生一个响应。使用相同的 UART 接口发回响应。
发送的数据大部分是二进制的。当我从 UART 接口读取时,我事先知道数据包的大小,所以我可以毫无问题地预分配内存。
我的问题是产生响应。我知道数据包的最大大小,因此我可以在构建响应时创建静态缓冲区。如果我要使用 ASCII 字符而不是二进制数据,我可以依靠 NULL 终止符来确定缓冲区中存储的数据的长度。但是,我正在处理二进制数据,因此使用 NULL 字节不起作用。相反,我必须保留一个变量来存储缓冲区中已经用完的字节数。我正在考虑使用自定义数据类型来存储二进制数据:
typedef struct {
unsigned char buff[2048];
size_t buff_used;
} binary_data_t;
处理这个问题的标准方法是什么?
一种方法是存储一个指针,指向数组中下一个字节应该放置的位置。
typedef struct {
unsigned char buff[2048];
char* pData;
} binary_data_t;
// at init
binary_data_t rspMsg;
rspMsg.pData = &rspMsg.buff[0];
// at entering data
*(rspMsg.pData) = data;
rspMsg.pData++;
// at sending data you know the length via
length = rspMsg.pData - &rspMsg.buff[0];
这是解决此问题的一种方法。
可以通过多种方式完成。
因为你知道你需要保存一个数据包的字节数,只需使用 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 );
我正在编写一个从 UART 接口读取数据的应用程序。数据以数据包的形式发送。每个数据包都有一个与之关联的通道。我的应用程序将接收到的数据包多路复用到虚拟通道(线程)中,以便每个通道都可以独立工作。当我收到一个数据包时,我必须根据它的内容做一些事情并产生一个响应。使用相同的 UART 接口发回响应。
发送的数据大部分是二进制的。当我从 UART 接口读取时,我事先知道数据包的大小,所以我可以毫无问题地预分配内存。
我的问题是产生响应。我知道数据包的最大大小,因此我可以在构建响应时创建静态缓冲区。如果我要使用 ASCII 字符而不是二进制数据,我可以依靠 NULL 终止符来确定缓冲区中存储的数据的长度。但是,我正在处理二进制数据,因此使用 NULL 字节不起作用。相反,我必须保留一个变量来存储缓冲区中已经用完的字节数。我正在考虑使用自定义数据类型来存储二进制数据:
typedef struct {
unsigned char buff[2048];
size_t buff_used;
} binary_data_t;
处理这个问题的标准方法是什么?
一种方法是存储一个指针,指向数组中下一个字节应该放置的位置。
typedef struct {
unsigned char buff[2048];
char* pData;
} binary_data_t;
// at init
binary_data_t rspMsg;
rspMsg.pData = &rspMsg.buff[0];
// at entering data
*(rspMsg.pData) = data;
rspMsg.pData++;
// at sending data you know the length via
length = rspMsg.pData - &rspMsg.buff[0];
这是解决此问题的一种方法。 可以通过多种方式完成。
因为你知道你需要保存一个数据包的字节数,只需使用 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 );