c++ - QByteArray 转换和指针转换

标签 c++ qt casting qbytearray

我正在使用 Qt 和 C++。我必须管理电子板的错误代码。我可以以必须将其转换为 QVariant 的 QByteArray 的形式获取这些错误。我没有找到任何实用的方法来做到这一点(所以如果你有一个我在这里听)。无论如何,试图将它(QByteArray)转换为 QVariant,我发现的唯一方法是使用这样的代码:

QByteArray value;     //This is the QByteArray where I have the error code
QVariant qVariantOut; //This is the QVariant where I want to put the error
qVariantOut = QVariant(*(quint64*)(void*)(&(value).data()[0]));

由于我使用了糟糕的类型转换步骤,我偶然发现了各种好的类型转换规则,我做了这样的事情:
qVariantOut =  QVariant(*(static_cast<quint64*(static_cast<void*>((&(value).data()[0]))));

这些类型转换似乎有效,所以我决定加深类型转换主题,但我不明白我得到的一些结果。下面我介绍我尝试过的所有案例。如果有人能给我一个解释(我会介绍我的)在每种情况下发生的事情,那就太好了。
  • qVariantOut = QVariant(*((quint64 *)value.data()));我认为这是可行的,因为 value.data() 返回一个 char* 并且 Actor quint64* 做一个 reinterpret_cast (如果我很好地解释了这里所说的: When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used? )。这个理由正确吗?
  • qVariantOut = QVariant(*(static_cast<quint64*>(value.data()) ));这个不起作用,因为我正在尝试直接对 quint64* 进行 static_cast。但在这里我有一个问题:为什么不能从 char* 转换为 quint64*。难道它们不是一些必须可以使用 static_cast 的基本 (POD) 类型吗?

  • 我想更好地理解这些转换......我什至发现有人说:“如果你需要转换指针,请通过 void* 转换它们”。评论?
  • qVariantOut = QVariant( (quint64*)(value.data()) );这有点像奖金。我正在尝试使用此代码在 QVariant 中放入一个指针...这给了我错误“ QVariant::QVariant(void) 在此上下文中是私有(private)的* ”我不明白什么这意味着。

  • 谢谢你。

    编辑 : 对于说这可能是 XY 问题的用户。这里有更多信息。我写了一个函数来从电子板上获取变量。这些变量可能是QString、quint64、qint32、quint8等等......在我的函数中,为了获取这些变量,我使用了一个外部函数(来自一个外部库,由我公司的电子部门内部开发,我必须使用它但不能修改它)。为了使用这个外部函数,我需要作为参数传递:我想要读取的变量(即:错误、警告、温度、固件版本……)、输出 QByteArray 和我想要读取的变量的大小(例如错误->sizeof(quint64)、温度->sizeof(quint8))。如您所知,这个外部函数返回一个 QByteArray。

    我将代码转换为 quint64 的事实只是我的函数的一个例子。

    我想将此 QByteArray 转换为 QVariant,以便我的函数可以返回此 qVariantOut,我将转换为正确的变量(例如:我知道我需要读取板的错误变量,我调用我的函数来设置变量大小并将其传递给将返回 QByteArray 的外部函数(连同变量名称)。此 QByteArray 将转换为在我的函数外部返回的 QVariant。在外部,我会将 QVariant 转换为正确的变量,例如 quint64错误,使用 QVariant 方法)。请注意 我这样做是因为系统的约束 (我需要使用该外部函数,它总是为我想要读取的每种类型的变量返回一个 QByteArray)也因为没有找到更好更实用的方法将 QByteArray 转换为最终变量(例如:如果我使用 qba.toLongLong ,而 qba 使用 QByteArray,它不起作用)......如果你有一个,正如我之前所说,我在这里听你说.

    无论如何,我不想过多地关注 XY 问题(但如果是 XY 问题,我显然想解决它),但我想更好地理解类型转换规则,并对我的疑问和问题进行 build 性的讨论: )

    最佳答案

    随着您的更新,这并不像最初看起来那么疯狂。你有一个内部 API 将随机变量放入 QByteArray 而不是像 QVariant 这样的东西,这正是它的用途,但我知道你被你所拥有的东西困住了,这有点疯狂。

    你有两个选择:

  • 投,但不需要做任何复杂的事情,只需使用 reinterpret_cast .投给 void*然后用 static_cast 回到别的东西与 reinterpret_cast 相同,所以您不妨调用reinterpret_cast开始。
  • memcpy(&target, byteArray.data(), sizeof(target));这避免了类型转换,但几乎一样丑陋。从理论上讲,鉴于内存对齐问题,它会更安全一些(不必依赖 QByteArray 中的数据与 reinterpret_cast 正确对齐)。它还可以让您随心所欲地保留数据,而不会冒着在背后回收 QByteArray 中的内部指针的风险。

  • 请注意,这两个选项仅适用于 POD 类型,但我假设除了 QString 之外,您返回的所有内容都是,对于 QString,您必须根据编码制作特殊情况(如果是 ASCII/Latin1 则非常简单)。

    至于为什么不能直接从 char* 到 quint64* 进行 static_cast,那不是 static_cast。您不能在不同类型之间进行静态转换,只能在相关类型之间进行静态转换,例如在 base* 和从 base 派生的类之间。在这个 answer by EdChum 中有一个很好的解释 static_cast 的有限用例。 .

    关于c++ - QByteArray 转换和指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206678/

    相关文章:

    c++ - 添加空间隔 Widget 导致 Qt 中的内存泄漏?

    qt - 更改后构建时如何告诉QT creator解析.pro文件?

    c - 将数组转换为指针时是否存在隐式 '&' 计算?

    Swift Cast 泛型类型

    c++ - OpenCV 2.4:在 MFC 中显示 cv::Mat

    c++ - Qt中的内存管理?

    C# Task.Run() 与 C++ std::async()

    casting - 如何在windbg上显示指定类型的变量

    c++ - 是否可以创建一个线程组,然后只有 "use"线程?

    c++ - QHash - 热获取随机键和值