【问题标题】:Save integer value as a byte value in char in ansi c在ansi c中将整数值保存为char中的字节值
【发布时间】:2014-01-09 20:50:22
【问题描述】:

我想将 ppm 文件另存为 P6。这仅意味着字节。我也想以并行方式保存它,所以这就是我使用mmap 来映射内存的原因。

这是我试图保存所有内容的代码的一部分:

        char* map;
        //...    
        int offset = sprintf(map,"P6\n%d %d\n%d\n",x,y,k);
        int counter = offset;

        for(i = 0; i < x; i++)
            {
                   for(j = 0; j < y; j++)
                   {
                        map[counter] = outputRed[i][j];
                        map[counter+1] = outputGreen[i][j];
                        map[counter+2] = outputBlue[i][j];
                        counter++;
                   }
            }

问题是我无法将红色、绿色和蓝色数组(都是 int)中的这些值保存到地图值中。

之前我只是将fputcfopen(FILE,"wb") 一起使用,这一切都很好,但现在我不能这样做了。

谁能告诉我该怎么做?

【问题讨论】:

    标签: c linux unix posix mmap


    【解决方案1】:

    您必须为每个像素将计数器增加3

    map[counter] = outputRed[i][j];
    map[counter+1] = outputGreen[i][j];
    map[counter+2] = outputBlue[i][j];
    counter += 3;
    

    【讨论】:

    • 但是为什么是 3?因为现在我遇到了分段错误
    • @sebap123:每个像素存储为三个字节。 - 如果出现分段错误,则可能是在计算内存映射大小时出错。
    • 我正在计算这样的地图大小:int filesize = x*y*sizeof(char);
    • @sebap123:每个像素需要 三个字节。加上文件头的大小(代码中的sprintf 部分)。
    • @sebap123:可以先写到单独的字符缓冲区,然后确定长度。
    【解决方案2】:

    您可以在复制每个像素的数据后递增计数器。这可能更容易理解。

    map[counter++] = outputRed[i][j];
    map[counter++] = outputGreen[i][j];
    map[counter++] = outputBlue[i][j];
    

    确保为映射分配了足够的内存。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2017-08-25
      • 2020-03-19
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2018-03-28
      • 2011-04-12
      相关资源
      最近更新 更多