我有一系列字节进入传输介质(一次一个字节),我需要重构成一个消息结构。两端共享一个公共头文件,其中消息结构为packed
。两端也使用相同的编译器进行编译,但考虑到包装属性,它应该无关紧要。这在C中很简单,但我必须将此代码放入一个用C ++编写的更大的代码库中。我尝试过使用C ++中的各种转换模式,但我似乎无法正确使用它们。
我已经在C中编写嵌入式固件一段时间了,但主要只读C ++代码。那么,什么是"适当的"在C ++中做这样的事情的方法?假设recv_msg
是一个回调函数,当一个新字节可供读取时执行:
void recv_msg(uint8_t data)
{
static int bytes_recvd = 0;
static struct msg = {0};
((uint8_t*)&msg)[bytes_recvd] = data;
if(++bytes_recvd == sizeof(struct msg)){
printf("Msg received\n");
bytes_recvd = 0;
g_msg_recvd_flag = 1;
}
}
我遇到的问题是严格键入C ++,不允许我将msg
任意转换为uint8_t
数组。这样的事情使得非常简单地一次一个字节地重建消息结构。
假设我有bytes_recvd
和struct msg
作为相关C ++类的成员,那么在C ++中如何做类似的事情呢?
答案 0 :(得分:1)
使用unsigned char
代替uint8_t
,您将避免严格的别名冲突。
unsigned char
可用于读取/修改任何对象:http://en.cppreference.com/w/cpp/language/reinterpret_cast
每当尝试读取或修改存储的值时 DynamicType类型的对象,通过类型为AliasedType的glvalue, 除非满足以下条件之一,否则行为是未定义的:
[...]
AliasedType是std :: byte,(自C ++ 17开始)char,或 unsigned char:this 允许检查任何对象的对象表示为 字节数组。
所以使用这个:
reinterpret_cast<unsigned char*>(&msg)[bytes_recvd] = data;
答案 1 :(得分:0)
std::vector<uint8_t> max
或
uint8_t msg[max_data]
然后您可以使用赋值运算符 msg [bytes_recvd] =数据