【问题标题】:c++ - reinterpret_cast to type from bufferc++ - reinterpret_cast 从缓冲区输入
【发布时间】:2016-01-17 04:37:56
【问题描述】:

我想知道是否有一种无需大量复制即可解决此问题的好方法。

比如说,我有一个字节缓冲区,我可以在其中保存很多东西。我会正确地保存 4 个字节的整数和浮点数等。

现在如果我的整数保存在缓冲区中的位置 0x0001,有没有办法可以创建一个 int* 并将其指向该位置?

我试过了:

int* ptr = reinterpret_cast<int*>(&data.dataPtr);

dataPtr 是一个const char*,其中 ofc 将地址保存在缓冲区中我的整数。

在我的转换 ptr 保存 dataPtr 的地址之后,当我取消引用 ptr 时,它会打印 dataPtr 的地址。我应该使用 static_cast 或 reinterpret_cast 再次转换以获取整数吗?

这甚至可以在没有遇到未定义行为的情况下实现吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    无法保证它可以正常工作,但您可以使其在某些编译器和系统上正常工作。

    首先,您可能想要投射data.dataPtr 而不是&amp;data.dataPtr。您想指向data.dataPtr 指向的缓冲区,对吗?不是指针变量本身。其次,如果dataPtrconst,那么你也应该将ptr 设为常量,以确保一定的安全性。所以我们有:

    const int* ptr = reinterpret_cast<const int*>(data.dataPtr);
    

    这还是有一些问题。

    data.dataPtr 可能不会存储与int 对齐的地址,在这种情况下它可能不起作用。有些系统支持未对齐的指针,有些则不支持。对于那些这样做的人,它通常很慢。

    data.dataPtr 可能没有存储足够的数据来组成int

    如果它到目前为止有效,int 的确切值将根据系统的字节顺序而有所不同。

    有时使用系统或编译器特定的行为是可以接受的,但前提是您确切地知道自己在做什么以及它为什么会起作用。

    要以标准投诉方式执行此操作,您必须逐个抓取字节并使用位移将它们组合成int

    您还应该注意指针别名。

    【讨论】:

    • 天哪,干杯,我很困惑,你是最棒的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多