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

标签 c++ pointers vector char message-queue

我有一个包含 cbor 字节的 uint8_t vector ,我必须将这些字节转换或复制到 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()] = '\0';

但只有一部分数据被转换或复制。两种方法似乎都失败了。我有一些值为 0 的字节。例如,这就是我在 vector 中的内容:

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 vector 传递到 posix 消息队列的更好方法?

最佳答案

问题:

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大小的实际数据长度的方法是定义自己的消息协议(protocol)。

例如:前 4 个字节表示数据长度,后 4 个字节表示源过程变量,其余数据为 cbor 数据。

一个简单的图表:

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

关于c++ - 将包含 cbor 数据的 vector<char> 转换为 const char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63027107/

相关文章:

c - typedef 结构体和指针

C# - Marshall 并将 void 指针传递给从 C# 调用的 C 函数

c++ - 打印并存储到类型类的 vector

c++ - 将 char* 转换为 std::string

c++ - 为什么这个 QT 应用程序以 SIGABRT 信号退出?

c++ - 延迟着色和衰减

c - C中指针赋值的区别

c++ - 迭代 vector/ map 数据结构 C++

c++ - 将 std::vector 复制到 boost::interprocess::vector

c++ - 将 COM 对象返回给 JScript