将double转换为unsigned char?
我试图将(双)的矩阵转换成一个无符号的字符,然后我可以写入一个.pmg文件...但它不工作。将double转换为unsigned char?
void writePNG(vector<double>& matrix)
{
vector<unsigned char> image;
ofstream myfile;
myfile.open("newFile.txt", ios::out); // writing to .txt file for now for testing.
if(!myfile.is_open())
{
cout << "Cannot open file";
}
for(int i=0; (i < 512*512); i++)
{
image[i] = (unsigned char) matrix[i];
}
myfile.close();
}
它不会转换数据。有任何想法吗??谢谢:)
- 错误:您正在创建大小为0的向量,然后写入其不存在的元素。
- 错误:你永远不将数据写入到文件
-
风格:您不必要关闭文件。当
fstream
对象超出范围时,它将被关闭 -
样式:您在循环中复制数据。使用
vector::vector
可更清楚地显示您的意图。 - 潜在的bug:无论输入矢量的大小如何,您都可以创建一个512x512的输出矢量。
- SSCCE您的测试用例不完整。
试试这个:
#include <vector>
#include <iostream>
#include <fstream>
void writePNG(const std::vector<double>& matrix)
{
std::ofstream myfile("newFile.txt", std::ios::out);
if(!myfile.is_open())
{
std::cout << "Cannot open file";
}
std::vector<unsigned char> image (matrix.begin(), matrix.end());
myfile.write(reinterpret_cast<const char*>(&image[0]), image.size());
}
int main() {
writePNG({
72, 101, 108.1, 108.2,
111, 0x2c, 0x20, 0x77,
0x6f, 0x72, 0x6c,
100.3, 10.4});
}
难道你不能使用static_cast
不,我需要'reinterpret_cast'作为不相关的指针类型。 – 2012-04-11 17:21:39
你的图像矢量具有零大小 - 你将不得不至少做一个push_back来添加一个元素。此外,double的大小与char的大小不同,因此您将失去信息。
您正在使用vector
的默认构造函数创建image
,该构造函数将向量初始化为空(不包含元素)。下标符号(image[i]
)不会创建元素,只会分配给已经存在的元素。
你有(至少)两种方式来解决这个问题:
- 声明
image
使用vector
,其分配所需的大小的构造函数:vector<unsigned char> image(512*512)
- 这将填充默认的512个* 512元素的矢量值(0用于unsigned char
) - 添加元素一个接一个使用
push_back
方法:image.push_back((unsigned char) matrix[i]);
你也必须令e最终的image
至myfile
的内容。
注意:使用static_cast<unsigned char>(...)
代替C型(unsigned char) ...
是个好习惯,因为前者可以发现后者不会标记的错误;这是不是在这种特殊情况下的问题,虽然
到底是什么错误?是否有编译器错误?该文件是否为空(这肯定是这种情况,因为您不写任何内容)?有没有运行时错误? – alfa 2012-04-11 14:45:48
将声明更改为'vector图像(512 * 512);'。 –
2012-04-11 14:46:16
那么你看到的错误是什么?矩阵向量中值的范围是什么?例如。如果-1 ... 1,那么你需要首先缩放值。 – 2012-04-11 14:47:48