【发布时间】:2016-12-22 01:48:06
【问题描述】:
我正在尝试读取 3D 图像,为此,我使用了一个库。 这个库告诉我数据的类型(int、float、double 等),并返回一个指向数据的 void 指针。我将其存储为 char*。
我正在创建一个方法,将 x,y,z 作为参数,并根据数据类型计算从 void 指针到请求的 x,y,z 值的偏移量。
但是,我现在需要转到“偏移”位置并读取 n 个字节(基于数据类型)并将值作为双精度返回(无论原始类型如何),但我不确定什么是最好的方法继续。
我最初考虑将 char* 指针转换为 int*、float*、double* 等...(基于数据类型),然后读取值 buffer[offset]。 但由于这是一个经常被调用的方法,我不确定每次都强制转换它是否有效。
谢谢。
编辑:这是一个 sn-p,但它不完全是真实的,因为我有多个类,等等......
class DataReader{
public:
DataReader(const char* filename);
~DataReader();
double GetValue(int x, int y, int z);
protected:
MyImage im_;
char* data_;
};
DataReader::DataReader(const char* filename)
{
this->im_ = read_image(filename);
this->data_ = (char*)im->data; // (return a void*)
}
DataReader::~DataReader()
{
}
double DataReader::GetValue(int x, int y, int z)
{
int databytes = this->im_->bytes_per_voxel;
int offset = z*100*100 + y*100 + x;
double value = 0;
// TODO: Get data from this->data_ at location 'offset'
return value;
}
【问题讨论】:
-
某个库通过其公共 API 为您提供
void*?我不会称其为 C++ 库——也不是一件好事。你确定,你是在编写 C++ 而不是 C? -
铸造效率超高,能分享一下代码sn-p吗?
-
如果你只是投射指针,那么成本几乎是 0
-
@whiteShadow 题外话,但你为什么坚持在你的代码中使用
this->?它把事情弄得乱七八糟,没有必要。 -
您是否尝试过使用自己的解决方案(第 4 段)并衡量性能?他们可以接受吗?
标签: c++ arrays pointers byte type-conversion