如何处理大于char类型的值

时间:2014-04-07 10:55:44

标签: c++

我知道有一天我会回来咬我。我正在读取图像,调整大小到48像素高(无论宽度如何),然后抓取总图像列并读取每个单独的像素以获得颜色值。所有这些信息都会写到文件中。代码的简洁版本是这样的:

unsigned char cols, rows;
unsigned char red, green, blue;
short int myCol, myRow;

cols = processedImage.columns();
rows = processedImage.rows();

myFile.write(reinterpret_cast<const char *>(&cols), sizeof(cols));

for (myCol = cols - 1; myCol >= 0; myCol--) {
  for (myRow = rows - 1; myRow >= 0; myRow--) {
    Magick::ColorRGB rgb(processedImage.pixelColor(myCol, myRow));
    red   = rgb.red()   * 255;
    green = rgb.green() * 255;
    blue  = rgb.blue()  * 255;
    myFile.write(reinterpret_cast <const char*> (&red),   sizeof(red));
    myFile.write(reinterpret_cast <const char*> (&green), sizeof(green));
    myFile.write(reinterpret_cast <const char*> (&blue),  sizeof(blue));
  }
}

这里的问题是文件比 char 所能容纳的文件宽。例如,我正在处理一个494x48像素的文件。

当我查看创建的(二进制)文件时,保留列数的第一行表示它是&#39; 238&#39; 238。下一行开始RGB数据:

 0: 238 // Column count
 1: 255 // Red
 2:   0 // Green
 3:   0 // Blue
 4: 255 // Red
 5:   0 // Green
 6:   0 // Blue

所以我被卡住了。如何将实际列值作为单行存储在结果文件中?

2 个答案:

答案 0 :(得分:0)

如果使用多个字符而不是一个字符呢?假设有4个字符来存储cols,rows等,因为字符可以存储0-255,所以4个字符将存储256x256x256x256,即32位,足够长

答案 1 :(得分:0)

回答我自己的问题。 感谢大家,他们做出了回应并帮助弄清楚我做错了什么。这里的问题源于几个月根据Arduino代码做出假设。 Arduino有一个INT / UINT,我用它来读取生成文件的值。我认为数据类型是uint8_t,而实际上我发现它确实是一个uint16_t。因为它弄乱了代码中的其他部分(即在文件中要寻找的位置),我已经切换到 char 数据类型,因为它只占用了1个字节。但在这样做的过程中,我坚持了上面提到的翻滚问题。所以解决方案,现在我更了解Arduino代码中的数据类型:

  1. 将图像文件处理更改为对行和列使用uint16_t
  2. (因为我可以访问它)更改Arduino端的读数也使用uint16_t
  3. 更改文件搜索命令,在&#34;标题&#34;之后再移动一个字节。所以数据是 阅读并没有被破坏。
  4. 最终,我现在停止使用Arduino的内置数据类型,并切换到实际上与他们所说的平台无关的数据类型。

    将这一点归结为另一种学习经历(在我实际学习c ++的整个过程中)......