将双精度转换为无符号字符
Converting double to unsigned char?
我正在尝试将(双精度)矩阵转换为无符号字符,以便我可以写入 .pmg 文件...但它不起作用。
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
可以更清楚地显示您的意图。 - 潜在错误:创建 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});
}
您正在使用默认构造函数 vector
创建image
,它将向量初始化为空(不包含任何元素)。 下标符号(image[i]
)不创建一个元素,只分配给一个已经存在的元素。
您(至少)有两种方法可以修复它:
- 使用
vector
的 ctor 声明image
分配必要的大小:vector<unsigned char> image(512*512)
-- 这将用默认值的 512*512 个元素填充向量(0 表示unsigned char
) - 使用
push_back
方法逐个添加元素:image.push_back((unsigned char) matrix[i]);
您还必须最终将image
的内容写入myfile
。
注意:使用static_cast<unsigned char>(...)
而不是C样式(unsigned char) ...
是一个好习惯,因为前者可以找到后者不会标记的错误;不过,在这种特殊情况下,这不是问题。
您的图像矢量大小为零 - 您至少必须执行push_back才能添加元素。 此外,双精度的大小与字符的大小不同,因此您将丢失信息。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中