0

我有两个相同的 C++ 代码,每个代码都读取相同的 .raw 图像文件,如下所示:

this->file_variable = fopen(filename, "r")

他们这样处理其中的信息:

status = fread ((void *)this->img1,
  sizeof(float),
  (this->width * this->height),
  this->file_variable)
)

两个代码之间的唯一区别是它们是在不同的盒子上编译的,但是我从 img1 数组中得到了完全不同的结果。我完全不知道如何开始调试它。谁能指出我正确的方向?

编辑:我正在慢慢获得有关文件的更多信息。它们是(宽 x 高)1800 x 1728 像素,1 通道,8 位深度。

4

4 回答 4

2

听起来文件是用二进制格式编写的,所以你需要同样打开它:

this->file_variable = fopen(filename, "rb")

如果没有“b”,它将被读取为 ASCII。

于 2013-04-05T00:17:41.467 回答
1

现在我看到了你的问题。您的数据存储在大端,您正在小端系统上读取它。您只需通过反转字节顺序来转换每个浮点数。使用这样的函数(取自其他地方的类似答案):

float ReverseFloat( const float inFloat )
{
float retVal;
char *floatToConvert = ( char* ) & inFloat;
char *returnFloat = ( char* ) & retVal;

// swap the bytes into a temporary buffer
returnFloat[0] = floatToConvert[3];
returnFloat[1] = floatToConvert[2];
returnFloat[2] = floatToConvert[1];
returnFloat[3] = floatToConvert[0];

return retVal;
}
于 2013-04-05T13:14:35.377 回答
0

不能保证值的二进制 (!) 格式在不同的机器上是相同的。其他this->价值从何而来?

于 2013-04-04T23:11:00.460 回答
0

这是一个翻转任何变量字节顺序的好功能,可以很容易地用来改变字节顺序。

void byteFlip(void* original, size_t numberOfBytes)
{
    char* reversed = (char*) malloc(numberOfBytes);
    for (int i = 0; i < numberOfBytes; i++)
    {
        reversed[i] = ((char*)original)[numberOfBytes - i - 1];
    }
    memcpy(original, reversed, numberOfBytes);
    free(reversed);
}

这将翻转“原始”参数中使用的变量的字节顺序。例子:

short a = 512;
//AAAAAAAA BBBBBBBB - 00000010 00000000
cout << a << endl; //outputs 512
byteFlip(&a, sizeof(short)); //flip byte order of 'a'
//BBBBBBBB AAAAAAAA - 00000000 00000010
cout << a << endl; //outputs 2

说明:此函数接受一个指向任何类型变量的指针,以及该变量的字节大小。由于我们正在反转字节顺序,并且 1 个字符 = 1 个字节,因此我们可以像反转字符串一样对待它。我们创建一个与变量大小相同的新字符串来保存反转的数据。现在我们使用 for 循环将每个字节作为 char 以相反的顺序复制到反转字符数组变量中。循环完成后,我们可以将反转字符串的内存复制到原始指针中。最后,我们释放了反向字符串变量的内存,因为它已被复制到原始指针中,因此不再需要。

于 2013-04-10T00:34:28.110 回答