gpt4 book ai didi

c++ - 不同类型的指针之间的分配有效,我不知道为什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:12 25 4
gpt4 key购买 nike

我是一名计算机视觉工程师,经常使用 OpenCV 库。我经常处理 unsigned short 类型的原始数据,并且必须将其分配给 OpenCV 的 cv::Mat 对象。

这个cv::Mat对象有一个叫做data的字段,这个字段的类型是unsigned char*,不管数据是什么类型。

因此,我将 unsigned short* 数据分配给 unsigned char* Mat.data 的操作如下:

// Obtain raw data from the hardware
const unsigned short* rawData = engine->getRawData();

// Create Mat with right dimensions and of type 16 Bit unsigned and 1 channel (unsigned short)
cv::Mat Test = cv::Mat::zeros(480, 640, CV_16UC1);

// Assign data by casting rawData to unsigned char* type
Test.data = (unsigned char*) rawData;

// Convert Test to 8Bit unsigned so I can visualize it
Test.convertTo(irIm, CV_8UC1);

我在很多情况下都使用这种方法并且效果很好,但我从来没有真正理解它为什么会起作用。我有一个 unsigned short 类型的数据 block ,然后我将它转换为 unsigned char*,程序没有崩溃,也没有数据丢失。

谁能帮助我理解这一点?

编辑:

关于我得到的答案。我知道数据仍然有效,但解释不同,但在我的脑海中仍然没有意义。

假设我有以下简称: 0010000100001000 。现在,我用计算器意识到这个短代表十进制的 8456。如果然后我将其解释为 unsigned char,我会将其读取为两个字节,然后是 00100001 字节,然后是 00001000,这绝不代表之前的短值。

所以我的问题仍然存在。在我的脑海中唯一有意义的是,OpenCV 以某种方式期待这些转换,并将在内部转换数据,因此它不会失去意义。

最佳答案

人们通常将原始字节缓冲区定义为 unsigned char*,因为 unsigned char 在语义上是一个字节。更好的方法可能是使用标准化的整数类型,例如 uint8_t,但两者都可以看到。

从一种指针类型转换为另一种指针类型只会改变它指向的数据的解释。它不会触及数据本身。

类似的情况是 void* 有时人们使用这种类型来传递未指定内容的缓冲区。但是,对于 void*,您不能使用指针算法的标准语法,在内部,此类指针通常被转换为适当的类型(或被视为单独的字节)。

关于c++ - 不同类型的指针之间的分配有效,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com