C ++中的任意类型转换

时间:2017-11-22 22:47:42

标签: c++ casting

我有一系列字节进入传输介质(一次一个字节),我需要重构成一个消息结构。两端共享一个公共头文件,其中消息结构为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_recvdstruct msg作为相关C ++类的成员,那么在C ++中如何做类似的事情呢?

2 个答案:

答案 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] =数据