将包含 cbor 数据的 vector<char> 转换为 const char *

Converting vector<char> that contains cbor data to const char *

我有一个包含 cbor 字节的 uint8_t 向量,我必须将字节转换或复制到 const char * 以在 POSIX 消息队列中使用。我尝试了以下方法

vector<uint8_t> cbor_data{/*has some data*/};
const char *data = (const char *)(cbor_data.data());

vector<uint8_t> cbor_data{/*has some data*/};
char* data = new char[cbor_data.size() + 1];
memcpy(data, cbor_data.data(), cbor_data.size());
data[cbor_data.size()] = '[=12=]';

但只有一部分数据被投射或复制。这两种方法似乎都失败了。我有几个值为 0 的字节。例如,这是我在向量中的内容:

a1,69,72,65,6d,69,6e,64,65,72,73,88,a5,66,63,6f,6e,66,69,67,a5,67,65,6e,61,62,6c,65,64,f4,72,72,65,6d,69,
6e,64,65,72,45,78,70,69,72,79,54,79,70,65,72,73,79,73,74,65,6d,43,61,6c,65,6e,64,61,72,54,69,6d,65,6c,72,
65,6d,69,6e,64,65,72,54,69,6d,65,00,66,76,69,65,77,65,64,f4,6b,77,72,69,74,65,41,63,63,65,73,73,66,72,65,
6d,6f,74,65,62,69,64,00,69,70,75,62,6c,69,73,68,65,72,a2,6c,64,6f,4e,6f,74,50,65,72,73,69,73,74,f5,6d,70

这是我打印数据时剩下的:

a1,69,72,65,6d,69,6e,64,65,72,73,88,a5,66,63,6f,6e,66,69,67,a5,67,65,6e,61,62,6c,65,64,f4,72,72,65,6d,69,
6e,64,65,72,45,78,70,69,72,79,54,79,70,65,72,73,79,73,74,65,6d,43,61,6c,65,6e,64,61,72,54,69,6d,65,6c,72,
65,6d,69,6e,64,65,72,54,69,6d,65,00

00 之后的所有内容似乎都丢失了。它不仅仅是在打印数据时。 strlen(data) 和 cbor_data.size() 不匹配。还有另一种方法可以解决这个问题吗?还是将 char/uint8_t 的向量传递到 posix 消息队列的更好方法?

如前所述,char 00 终止 C 风格的字符串。

如果接收方需要 CBOR二进制数据,它应该处理 00 字符。

00 = 3 位 000 表示无符号整数 + 5 位有效载荷 0-23 或字节长度指示符,在本例中为无符号整数有效载荷 0。无符号整数 0 也可以表示更长,但它总是以结尾至少一个 0 字节。

您可以尝试使用 0 的“负”整数:3 位 001 + 有效负载 00000。

所以尝试用 0x40 替换 00。没有使用 CBOR 的经验,所以不确定。

问题:

a better way to pass a vector of char/uint8_t to a posix message queue?

真正的问题在你的评论中,

I can pass the actual size but on the receiving end the buffer has size that is way greater than the actual message length.

因为它是原始指针,mq_receive 的大小必须大于 msg 的实际大小。

了解 recv 大小的实际数据长度的方法是定义您自己的消息协议。

例如:前4字节为数据长度,后4字节为源进程标签,其余数据为cbor数据。

一个简单的图表:

================================================================
| Data Legnth | Process ID or insert what you want | cbor data |
================================================================