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

问题描述

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

我有一个二进制文件,包含各种数字,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读取到结构体数组中

解决方案

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

解决方案二:

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

解决方案三:

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

时间: 2024-12-14 04:08:49

数据类型-c语言中,二进制文件中怎样判断的各个数据的类型的相关文章

c语言-C语言中的float数据类型

问题描述 C语言中的float数据类型 C语言中的float数据用32位存储,其中有6位为小数位,那么小数点后的值应该不超过2^6-1,而实际上却是保留小数点后6位,这是怎么回事? 解决方案 你的问题本身就不对,float的位数精度是23位,也就是1/2^23,折算成10进制,在1/10^6.x,为了不丢失最后的那一点精度,所以用7位表示尾数而不是6位.http://blog.csdn.net/dxy612/article/details/5518477 解决方案二: 首先我的观点同上,补充一点

C语言中的BYTE和char深入解析_C 语言

例如,在下面的源程序中""""之内的"你"."好".","."C"."!"."\n"就属于程序要处理的字符. 复制代码 代码如下: #include <stdio.h>int main(void){      printf("你好,C!\n");         return 0;}    该源程序中的其他字符则属于

关于c语言中getchar()的问题

问题描述 关于c语言中getchar()的问题 #include<stdio.h> int main(void) { int guess = 1; printf("Pick an integer from 1 to 100. I will try to guess"); printf("it. Respond with a y if my guess is right and with"); printf(" an n if it is wro

Go语言中struct的匿名属性特征实例分析_Golang

本文实例分析了Go语言中struct的匿名属性特征.分享给大家供大家参考.具体分析如下: Go语言中struct的属性可以没有名字而只有类型,使用时类型即为属性名.(因此,一个struct中同一个类型的匿名属性只能有一个) 复制代码 代码如下: type PersonC struct {      id      int      country string  }    //匿名属性  type Worker struct {      //如果Worker有属性id,则worker.id表示

判断输入的是日期类型

问题描述 asp.net中怎么判断输入的是日期类型如2008-05-01 解决方案 解决方案二:if(DateTime.TryParse("2008-05-01")){//日期格式正确}解决方案三:<asp:RangeValidatorID="RangeValidator1"runat="server"ErrorMessage="RangeValidator"Type="Date"></a

c语言-C语言中select函数 应用于网络存储中配合fread/fwrite是否存在阻塞问题

问题描述 C语言中select函数 应用于网络存储中配合fread/fwrite是否存在阻塞问题 利用fread fwrite 读写网络存储上的文件时,是否会出现阻塞问题? 我的感觉是会出现但是无法通过select判断,因为select判断的是内容是否存在,就是文件是否存在,而对于文件fread fwrite没有发现文件也会报错 但是一旦文件存在开始读写以后发生了网络传输中断引起阻塞 那么还是会挂住 而所谓的非阻塞机制无法发挥作用 不知道我的理解是否正确? 谢谢大家发表看法. 解决方案 阻塞和非

详解C语言中的char数据类型及其与int类型的转换_C 语言

C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed.虽然char在标准中是unsigned(因为char类型提出的初衷是用来表示ascii码,ascii码的范围是0~127),但实际情况中究竟是signed还是unsigned取决于编译器. 可通过下面程序判断编译器的默认char类型: void char_type() { char c=0xFF; if(c==-1) printf

文件传输-C语言中memset()如何用?下面的程序运行时为什么在文件中显示的age信息都是乱码?

问题描述 C语言中memset()如何用?下面的程序运行时为什么在文件中显示的age信息都是乱码? C语言中memset()如何用?下面的程序运行时为什么在文件中显示的age信息都是乱码? 如何改正?#include#include#define N 3 void main(){typedef struct student{ char id[6]; char name[8]; int age;}STU;FILE *fp;STU stu1[N]stu2[N];if((fp=fopen(""

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指