说我有一个二进制文件;它包含正二进制数,但以大端编写为32位整数
如何阅读此文件?我现在有这个。
int main() {
FILE * fp;
char buffer[4];
int num = 0;
fp=fopen("file.bin","rb");
while ( fread(&buffer, 1, 4,fp) != 0) {
// I think buffer should be 32 bit integer I read,
// how can I let num equal to 32 bit big endian integer?
}
return 0;
}
答案 0 :(得分:7)
将缓冲区声明为:
unsigned char buffer[4];
你可以用它来转换字数:
int num = (int)buffer[0] | (int)buffer[1]<<8 | (int)buffer[2]<<16 | (int)buffer[3]<<24;
<强>顺便说一句强>
当然这适用于小端的x86架构 - 否则您的平台endianess可能与您的文件的endianess匹配,因此不需要转换。通过这种方式,您可以直接读入您的int而无需进行修改。
答案 1 :(得分:4)
您需要先了解您的结尾:
How can I find Endian-ness of my PC programmatically using C?
然后你需要采取相应的行动。如果您与文件相同,则可以按原样读取该值,如果您处于不同的endianess,则需要重新排序字节:
union Num
{
char buffer[4];
int num;
} num ;
void swapChars(char* pChar1, char* pChar2)
{
char temp = *pChar1;
*pChar1 = *pChar2;
*pChar2 = temp;
}
int swapOrder(Num num)
{
swapChar( &num.buffer[0], &num.buffer[3]);
swapChar( &num.buffer[1], &num.buffer[2]);
return num.num;
}
while ( fread(&num.buffer, 1, 4,fp) != 0)
{
int convertedNum;
if (1 == amIBigEndian)
{
convertedNum = num.num
}
else
{
convertedNum = swapOrder(num);
}
// Do what ever you want with convertedNum here...
}
答案 2 :(得分:3)