我主要是一名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 中我需要这样的东西...我可以自己写,但我不知道如何。
答案 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;
}
这导致第一部分最重要。我想这就是你想要的。