Tag: binaryfiles

从二进制文件中读取动态大小的字符串

我需要知道如何使用fread()从二进制文件中读取字符串。 根据我的理解,事情是,如果我想将某些字符串的值复制到一个声明如下的新字符串: char *string; 我需要先使用strlen()计算另一个字符串的长度,使用该值为malloc保留新字符串的内存 ,然后使用strcpy()将另一个字符串的值复制到我的新字符串中 有点像: newLength = strlen ( otherString ) + 1; string = malloc ( sizeof ( char ) * newLength ); if ( string == NULL ) { return ( FALSE ) } 但是如果我从二进制文件中读取数据会发生什么,并且我试图从所述文件中读取一个字符串,但我事先并不知道它的长度,因此我不能使用malloc为所述字符串保留内存? 这是否有效,即使我还没有为字符串保留内存(我不太相信)?: fread ( string, sizeof ( char ), strlen ( string ), currentFile ); 我现在有点卡住了。 希望你们能给我一些启示并引导我一点。

用C ++写一个文件的不同结构?

我需要一种方法将三种不同类型的结构写入二进制文件,以后必须进行搜索。 (例如,结构A有两个字段,一个是int和一个char; struct B有一个int和一个long;我需要输出所有结构,其int等于键盘给出的结构)。 我理解如何在文件中编写相同类型的结构以及如何搜索它们,但在这里我只是迷失了,我想出的最好的事情是声明一个包含所有可能需要的字段的结构并留下我不需要的字段空的,但它确实感觉不对,有一个更好的方法来做到这一点。 我读过关于二进制文件的内容并且找不到任何相关内容,大多数示例和教程都涉及编写一种数据类型。 有人能指出我正确的方向吗? 编辑:我正在寻找@Jerry_coffin所谓的数据库模式,可能会使用现有的数据库系统之一,最好的方法。 谢谢大家的建议

如何按指令读取二进制可执行文件?

有没有办法以编程方式从x86架构上的二进制可执行文件中读取给定数量的指令? 如果我有一个简单的C程序hello.c的二进制文件: #include int main(){ printf(“Hello world\n”); return 0; } 在使用gcc编译之后,反汇编函数main如下所示: 000000000000063a : 63a: 55 push %rbp 63b: 48 89 e5 mov %rsp,%rbp 63e: 48 8d 3d 9f 00 00 00 lea 0x9f(%rip),%rdi # 6e4 645: e8 c6 fe ff ff callq 510 64a: b8 00 00 00 00 mov $0x0,%eax 64f: 5d pop %rbp […]

在C中使用mmap读取二进制文件时的Segfault

我试图在C中使用mmap只是为了看它是如何工作的。 目前我尝试使用mmap逐字节读取二进制文件。 我的代码是这样的: #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; char *data; for ( int i = 1; i<argc; i++) { if(strcmp(argv[i],"-i")==0) fd = open(argv[i+1],O_RDONLY); } data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000); int i = 0; notation = data [i]; // …… } 当我尝试使用notation = data […]

便携式C二进制序列化原语

据我所知,C库没有帮助将数值序列化为非文本字节流。 如我错了请纠正我。 使用的最标准工具是来自POSIX的htonl等人。 这些function有缺点: 没有64位支持。 没有浮点支持。 签名类型没有版本。 反序列化时,无符号到符号的转换依赖于有符号整数溢出,即UB。 它们的名称没有说明数据类型的大小。 它们依赖于8位字节和精确大小的uint_ N _t的存在。 输入类型与输出类型相同,而不是引用字节流。 这要求用户执行指针类型转换,这可能在对齐时不安全。 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这种做法很糟糕,导致意外错误。 用于将任意大小的char化为8位标准字节的接口将落在C标准之间,该标准不真正确认8位字节,并且无论标准(ITU?)将八位位组设置为基本传输单位。 但旧的标准没有得到修订。 现在C11有许多可选组件,可以添加二进制序列化扩展以及线程之类的东西,而不需要对现有实现提出要求。 这样的扩展是否有用,或者担心非二进制补充机器是否毫无意义?

如何使用fread和fwrite函数来读写二进制文件?

嗨,在我的项目中,我要读取一个.bin文件,其中包含short(16 bit values)forms的传感器数据。 我正在使用fread函数进入缓冲区,但我觉得读入没有正确发生。 我的意思是我写的东西和我读的东西之间没有一致性。你们能否说出这里出了什么问题? 这不是我项目中的代码……我只是想在这里validationfread和fwrite函数。 #include void main() { FILE *fp = NULL; short x[10] = {1,2,3,4,5,6,5000,6,-10,11}; short result[10]; fp=fopen(“c:\\temp.bin”, “wb”); if(fp != NULL) { fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); rewind(fp); fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); } else exit(0); printf(“\nResult”); printf(“\n%d”,result[0]); printf(“\n%d”,result[1]); printf(“\n%d”,result[2]); printf(“\n%d”,result[3]); printf(“\n%d”,result[4]); printf(“\n%d”,result[5]); printf(“\n%d”,result[6]); printf(“\n%d”,result[7]); printf(“\n%d”,result[8]); printf(“\n%d”,result[9]); fclose(fp) } […]

如何在不使用库的情况下获取jpeg文件的宽度/高度?

首先我想说我多次尝试通过谷歌搜索找到答案,我发现很多结果但我不明白,因为我不知道读取二进制文件的想法,并将获得的值转换为可读的价值。 我尝试过做什么 unsigned char fbuff[16]; FILE *file; file = fopen(“C:\\loser.jpg”, “rb”); if(file != NULL){ fseek(file, 0, SEEK_SET); fread(fbuff, 1, 16, file); printf(“%d\n”, fbuff[1]); fclose(file); }else{ printf(“File does not exists.”); } 我想要一个简单的解释与示例显示,如何从其标头获取jpeg文件的宽度/高度,然后将该值转换为可读值。

读取每个30字节大二进制文件的最快方法?

读取大型二进制文件(2-3 GB)的每30个字节的最快方法是什么? 我已经读过由于I / O缓冲区而导致fseek出现性能问题,但我不想在抓取每30个字节之前将2-3 GB的数据读入内存。

为什么fwrite()在Mac OS X上使用C中的“wb”写入二进制文件?

为了学习C并理解二进制文件和文本文件之间的区别,我试图将一个字符串写入文件,因为两种文件类型都是这样的: char * string = “I am a string!”; FILE * filePtrA = fopen(“/output.txt”, “wt”); fwrite(string, strlen(string), 1, filePtrA); FILE * filePtrB = fopen(“/output.bin”, “wb”); fwrite(string, strlen(string), 1, filePtrB); fclose(filePtrA); fclose(filePtrB); 但是”wt”和”wb”都是作为文本文件写入的,其中”wb”应该写为二进制文件。 Hex对于这两个文件都是这样的: 49 20 61 6D 20 61 20 73 74 72 69 6E 67 21 为什么会发生这种情况,我怎样才能将内容写成二进制文件? 我已经读过操作系统(Mac OS X 10.6 – GCC 4.2)可能无法区分二进制文件和文本文件,但我仍然难以理解为什么hex编辑器不会发现任何差异。

使用fgetc时,是否可以将EOF与正常的字节值混淆?

我们经常使用这样的fgetc : int c; while ((c = fgetc(file)) != EOF) { // do stuff } 从理论上讲,如果文件中的某个字节的值为EOF ,则此代码存在错误 – 它会提前中断循环并且无法处理整个文件。 这种情况可能吗? 据我所知, fgetc内部将从文件读取的字节转换为unsigned char ,然后转换为int ,并返回它。 如果int的范围大于unsigned char的范围,这将起作用。 如果不是(可能那么sizeof(int)=1 )会发生什么? fgetc有时会从文件中读取等于EOF的合法数据吗? 它会改变从文件中读取的数据以避免单值EOF吗? fgetc会是一个未实现的function吗? EOF会不会是另一种类型,比如long ? 我可以通过额外的检查使我的代码变得简单: int c; for (;;) { c = fgetc(file); if (feof(file)) break; // do stuff } 如果我想要最大的便携性是必要的吗?