从C中读取文件中的数字

时间:2011-10-13 05:02:42

标签: c file byte

我主要是一名Python程序员,但我一直在使用 C ,因为Python对于图形来说太慢了(20 fps移动分形FTW)。我虽然打了一个棘手的问题...... 我在十六进制编辑器中写了一个小文件来测试。当我尝试读取第一个字节5A时,它正确地给了我90这样的程序......

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned char number;
    fread(&number,1,1,data);
    printf("%d\n",number);
}

但是当我尝试读取前四个字节,5A F3 5B 20时,我得到一个整数542896986

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned long number;
    fread(&number,1,4,data);
    printf("%d\n",number);
}

应该是1525898016 !!! 问题是它颠倒了字节顺序。 GAH!当然!该程序的工作方式取决于机器。现在我们就是这个主题,即使字节也无法在每台机器上运行!

所以我需要帮助...在Python中我可以使用struct.pack和struct.unpack使用任何格式(长,短,单,双,有符号,无符号,大端,小端)将数据打包成字节打开包装。在 C 中我需要这样的东西...我可以自己写,但我不知道如何。

3 个答案:

答案 0 :(得分:1)

我认为你可以找出(Endianness)http://en.wikipedia.org/wiki/Endianness,然后读取字节顺序。

答案 1 :(得分:1)

在将数据写入文件之前对数据使用htonl的最简单方法可能就是使用ntohl(因此文件将采用网络/大端顺序)和{{1}}时read(将网络订单数据转换为本地约定,无论是什么)。

如果您需要为一种类型的某些值执行更多操作,则可能需要为此目的查找更完整的库,例如Sun XDR或Google Protocol Buffers

答案 2 :(得分:0)

喜欢这个吗?

unsigned long bin = 0;
unsigned char temp = 0;

for(unsigned char i = 0; i < 4; i++) {
    fread(&temp,1,1,data);
    bin = (bin << 8) | temp;
}

这导致第一部分最重要。我想这就是你想要的。