【问题标题】:QByteArray to unsigned char does not fully copyQByteArray 到 unsigned char 不完全复制
【发布时间】:2019-07-11 02:11:56
【问题描述】:

我需要将 QImage 的 QByteArray 转换为 unsigned char *。

我是这样做的:

QByteArray data;
QBuffer buffer(&data);

buffer.open(QIODevice::WriteOnly);
convImage.save(&buffer, "PNG");
buffer.close()

unsigned char *data_image = (unsigned char *)malloc(data.size());
memcpy(data_image, reinterpret_cast<unsigned char *>(data.data()), (unsigned int)data.size());

但是data_image对比图片的QByteArray的结果是这样的:

data = (图片的QByteArray)

data_image = unsigned char* 来自数据

我认为它没有完全复制。我需要用于外部 DLL 函数的 unsigned char* 数据。

【问题讨论】:

  • 您希望您的调试器如何准确地知道data_image 指向多少字节?提示:调试器认为它是一个以 null 结尾的字符串。当然,事实并非如此。
  • @SamVarshavchik 如果它成功复制了整个字节数组,我该如何测试它?
  • @TerribleDog 你想用调试器测试吗?
  • 您执行调试器具有的任何命令,这些命令明确显示给定内存位置的特定字节数。命令因调试器而异,但所有调试器都实现此基本功能。这就是调试器的用途。
  • @eyllanesc 我只想知道 unsigned char* 是否从 QByteArray 对象中获取所有数据。

标签: c++ qt


【解决方案1】:

您看不到data_image 数组的完整长度,因为它只是一个指针,无法知道它的实际大小。 因此,调试器正在应用一些标准规则以在它认为应该停止时停止。这样的规则是在 NULL 字节上停止。

如果您使用的是 Qt Creator,有几种方法可以强制调试器显示更多数据:

  1. 右键单击您感兴趣的变量并选择Change Value Display Format &gt; Array of xxx items。这是最简单的方法,但它受到限制,因为您只能选择 10、100、1,000 或 10,000 个项目。
  2. 右键单击您感兴趣的变量并选择Open Memory Editor &gt; Open Memory View At Object Address。这是最通用的,因为您可以看到内存中的所有内容,但如果您不习惯使用内存视图,它可能会更加混乱。

【讨论】:

    【解决方案2】:

    如果你有QImage,你可以做的更简单:

    unsigned char *data_image = (unsigned char *)malloc(convImage.sizeInBytes());
    memcpy(data_image, convImage.bits(), convImage.sizeInBytes());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2013-07-20
      • 2013-02-26
      • 1970-01-01
      • 2014-02-19
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多