我有两个相同的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位深度。
答案 0 :(得分:2)
听起来这个文件是以二进制格式编写的,所以你需要同样打开它:
this->file_variable = fopen(filename, "rb")
没有“b”,它被读作ASCII。
答案 1 :(得分:1)
现在我看到了你的问题。您的数据以big endian存储,您可以在一个小端系统上读取它。您需要通过反转字节顺序简单地转换每个浮点数。使用这样的函数(取自其他地方的类似答案):
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;
}
答案 2 :(得分:0)
无法保证不同计算机上的二进制(!)格式的值相同。其他this->
值来自何处?
答案 3 :(得分: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);
}
这将翻转'original'参数中使用的变量的字节顺序。 例如:
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循环将每个字节以相反的顺序复制为反转字符数组变量。循环完成后,我们可以将反转字符串的内存复制到原始指针中。最后,我们释放了反向字符串变量的内存,因为它已被复制到原始指针中,因此不再需要。