c语言中,二进制文件中怎样判断的各个数据的类型 5C

我有一个二进制文件,包含各种数字,stirng char。但是我不知道里面的各个数据的类型,只知道各个数据的名字。然后怎么判断各个数据的类型。(比如 8bit 的 char, 16 bit 的 boolean 之类的)然后再转成要求的数据类型输出(printf)。
我打算先用fread一条一条读取这些文件到结构体数组中,。主要问题是我不知道各个数据的类型,用不了fread!!!
老师给的提示是说,先把二进制文件转成十六进制或其他格式 查看bytes,shorts and 32bit integer,floats, double 和string/char 之类的。 但是我转成十六进制文件后根本就看!不!懂!怎!么!破!啊!!
——————————————————edit——————————————————
我第一次做的问题是,已知二进制文件中的各个数据名字和类型,然后读取到结构体数组中。 第一步我先创建一个结构体:
struct columns{
unsigned int mine;
unsigned short hope;
float bee;
int agreement;
int elbow;
short music;
char drink;
signed int horses;
signed int crib;
double process;
signed char copy;
char ornament[10];
char hand;
short orange;
float hot;
char metal;
unsigned short berry;
};
然后fread 一条一条读取
for(i =0; i< size; i++){
fread(&p[i].mine, sizeof(unsigned int), 1, fp);
fread(&p[i].hope, sizeof(unsigned short), 1, fp);
fread(&p[i].bee, sizeof(float), 1, fp);
fread(&p[i].agreement, sizeof(int), 1, fp);
fread(&p[i].elbow, sizeof(int), 1, fp);
fread(&p[i].music, sizeof(short), 1, fp);
fread(&p[i].drink, sizeof(char), 1, fp);
fread(&p[i].horses, sizeof(signed int), 1, fp);
fread(&p[i].crib, sizeof(signed int), 1, fp);
fread(&p[i].process, sizeof(double), 1, fp);
fread(&p[i].copy, sizeof(signed char), 1, fp);
fread(&p[i].ornament, sizeof(char), 10, fp);
fread(&p[i].hand, sizeof(char), 1, fp);
fread(&p[i].orange, sizeof(short), 1, fp);
fread(&p[i].hot, sizeof(float), 1, fp);
fread(&p[i].metal, sizeof(char), 1, fp);
fread(&p[i].berry, sizeof(unsigned short), 1, fp);
}
最后printf输出,结果:
mine, hope, bee, agreement, elbow, music, drink, horses, crib, process, copy, ornament, hand, orange, hot, metal, berry
1, 4, -1.125000, 1, 1, 1, 1, 65, 232,16.445312, -6, map, 1, 1, 78.483688, =, 18075

**但是二进制文件中的各个数据前面的有符号无符号,int或double之类的都变了,我怎么判断这些,然后我还可以用fread读取到结构体数组中

3个回答

你首先要知道数据结构是怎样的,然后就是从第一个字节开始,按照字段类型读取指定长度的值,如果遇到哪些可变长度的,比如字符串,那么需要增加一个字段,来表示后面字节的长度

herochenling
herochenling 大神,,具体怎么做,用哪个命令函数?您能再看看我的问题吗?我添加了细节
4 年多之前 回复

我觉得你问问题的时候,coding的代码最好整齐一点

herochenling
herochenling 我的那个只是举例,不是真正的代码,而且不是挺整齐的么~~
4 年多之前 回复

如果字符串按照固定长度字符数组处理的话
可以直接读写 整个 struct 但是不利于 移植,因为不同编译系统 对齐方式,数据类型的长度等等,可能不同
如果,非要可以移植的话,那就定义好每个数据类型的长度
读取的时候转换成编译系统对应的格式

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问