c++ - C++中的任意类型转换

标签 c++ casting

<分区>

我有一系列字节通过传输介质传入(一次一个字节),我需要将其重组为消息结构。两端共享一个公共(public)头文件,其中消息结构被打包。两端也使用相同的编译器编译,尽管考虑到打包属性应该无关紧要。这在 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++ 中完成类似的事情?

最佳答案

使用 unsigned char而不是 uint8_t ,您将避免严格的别名冲突。

unsigned char可用于读取/修改任何对象:http://en.cppreference.com/w/cpp/language/reinterpret_cast

Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true:

[...]

AliasedType is std::byte, (since C++17)char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.

所以使用这个:

reinterpret_cast<unsigned char*>(&msg)[bytes_recvd] = data;

关于c++ - C++中的任意类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47445036/

相关文章:

c++ - 作为非模板类​​成员的模板类变量

c# - 为什么我不能将 int 转换为 T,但可以将 int 转换为 object,然后将 object 转换为 T?

java - 在java中自动装箱/将Long强制转换为int的更简单方法

c - 自动类型转换差异

c++ - 使用 CMake 生成 DLL 配置类型

c++ - 使用 "maximize speed"但不是 "minimize size"的堆问题

C++ 简单图像碰撞

c++ - 如何设计具有 "annotated"字段的类?

scala - 如何在 Scala 中将整数转换为字符串?

Java 对象转换行为异常