【问题标题】:How to append an enum represented by a series of hex values to QByteArray?如何将由一系列十六进制值表示的枚举附加到 QByteArray?
【发布时间】:2019-01-30 18:25:21
【问题描述】:

我有一些枚举,它们以下列方式由一系列十六进制值表示:

enum someEnum
{
    NameA = 0x2121,
    NameB = 0x2223,
    NameC = 0x2020
};

我想通过以下方式将这些枚举之一附加到 QByteArray:

QByteArray anArray;
anArray.append(NameA);

但是这种方法会产生警告

implicit conversion from 'int' to 'char' changes value from 8481 to 33.

事实上,即使我做了以下事情:

anArray.append(static_cast<char>(NameA));

它只附加 0x21(十进制 33)。

我还尝试了以下操作:

const char * t = reinterpret_cast<char*>(NameA);
anArray.append(t, sizeof(t));

但这会导致分段错误。

我当然可以在没有任何价值损失或崩溃或任何其他问题的情况下执行以下操作:

anArray.append(0x21);
anArray.append(0x21);

但我不想这样,我想直接附加枚举。你能建议一个正确的方法吗?

非常感谢。

【问题讨论】:

  • 十六进制、八进制、十进制、二进制、 表示无关。这只是写相同数字的不同方式。
  • @JesperJuhl 我没说这很重要,我只是想不通为什么 QByteArray 不能正确附加值。
  • 因为 QByteArray 使用单独的 bytes 操作(实际上是 char 但在这里无关紧要)并且您的 enum 的各个值都超过了单个字节可以表示的值.它不解释数据,它不知道它存储的什么——它只是一个字节流。因此,要将您的 enum 值存储在其中,您需要将它们转换为一系列字节。顺便说一句,“如何将十六进制表示的枚举附加到 QByteArray?” 确实表示您认为十六进制表示很重要。
  • 那么,有没有办法可以追加多个字节?
  • 是的。阅读the documentation,尤其是appendprependpush_backinsert的各种重载。另外,如下面的答案所述,请查看QDataStream

标签: c++ qt hex qbytearray


【解决方案1】:

使用以下代码

QByteArray byteArray;
// this will store the integer as a hex value
byteArray.append(QByteArray::number(NameA, 16));
// this will store the integer as a base 10 value
byteArray.append(QByteArray::number(NameA));

【讨论】:

  • 这段代码有点奇怪,它无法编译。
  • 对不起,我错过了追加函数调用
【解决方案2】:

或许你可以使用 QDataStream:

QByteArray byteArray;
QDataStream dataStream(&byteArray, QIODevice::WriteOnly);

dataStream << NameA;

抱歉,我现在没有可用的 qt,我无法对此进行测试

【讨论】:

  • 我测试过 :) 有一个小问题,不确定它是否适合您:它不存储 0x2121,但 0x002121... 可能是因为枚举的大小。 .. 在 c++11 中,您可以设置枚举类对象的大小:enum smallenum: int16_t
  • 是的,我注意到它添加了一个00,但我已经测试过,目前没有任何问题,让我们看看进一步测试后会发生什么。
  • 请注意,默认情况下QDataStream 使用大端(可配置)。另外documentation 建议使用预定义大小的类型,因此建议转换为qint16 (在写入和读取时)。
  • @MarekR 谢谢,这个信息帮了大忙。在转换为short(在qt中又名qint16)之后,它不再添加那个00了。
猜你喜欢
  • 2014-08-24
  • 1970-01-01
  • 2015-11-12
  • 2015-08-19
  • 2013-10-16
  • 2023-03-28
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多