二进制文件和文本文件的详细以及如何生成二进制文件
- 格式:docx
- 大小:25.21 KB
- 文档页数:5
python对文本文件和二进制文件操作的三个通用步骤Python对文本文件和二进制文件的操作涉及三个通用步骤:打开文件、读写文件内容以及关闭文件。
1. 打开文件:在Python中,可以使用`open()`函数来打开一个文件。
这个函数接受文件路径和打开模式作为参数,并返回一个文件对象。
文件路径可以是绝对路径或相对路径。
打开模式分为读取模式('r')、写入模式('w')、追加模式('a')以及二进制模式('b')等。
例如,要打开一个文本文件用于读取,我们可以使用以下代码:```pythonfile = open('example.txt', 'r')```2. 读写文件内容:一旦文件打开,我们可以使用文件对象的方法来读取文件内容或写入新的内容。
对于文本文件,可以使用`read()`、`readline()`和`readlines()`方法来读取文件内容,或使用`write()`方法来写入新的内容。
- `read()`方法将整个文件内容读取到一个字符串中。
- `readline()`方法每次读取文件的一行,并返回一个字符串。
- `readlines()`方法将文件的每一行读取到一个列表中,每一行作为一个元素。
- `write()`方法将给定的字符串写入文件中。
对于二进制文件,可以使用`read()`和`write()`方法来读取和写入二进制数据。
```python# 读取文件内容content = file.read()print(content)# 写入新的内容file.write('This is a new line.')```3. 关闭文件:在完成文件操作后,应该及时关闭文件,以释放系统资源。
可以使用文件对象的`close()`方法来关闭文件。
```pythonfile.close()```为了避免忘记关闭文件,可以使用`with`语句来自动关闭文件。
文件的二进制1. 引言在计算机科学中,文件是存储信息的一种重要方式。
无论是文本文件、图像文件还是视频文件,它们都以二进制形式存储在计算机硬盘上。
本文将深入探讨文件的二进制表示形式、二进制转换以及与二进制相关的一些常见概念。
2. 文件的二进制表示计算机中所有数据都以二进制形式存储和处理。
而文件作为数据的一种形式,也不例外。
在计算机内部,每个文件都由一系列字节组成。
每个字节由8个比特(bit)组成,每个比特可以表示0或1。
例如,对于一个文本文件,其中包含”Hello, World!“这句话。
在计算机中,该句话被转换为ASCII码,并以二进制形式存储。
具体来说,ASCII码中的每个字符都有一个对应的7位或8位二进制数值。
因此,”Hello, World!“可以用以下二进制表示:01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 0110111101110010 01101100 01100100 00100001这样,通过将每个字符转换为对应的ASCII码,并将其转换为二进制形式,我们可以得到文件的二进制表示。
3. 二进制转换在计算机中,将其他进制转换为二进制或将二进制转换为其他进制是非常常见的操作。
以下是几种常见的二进制转换方法:3.1 十进制转二进制十进制数转换为二进制数时,可以使用除2取余法。
具体步骤如下:1.将十进制数除以2,记录下商和余数。
2.将上一步得到的商再次除以2,继续记录商和余数。
3.重复上述步骤,直到商为0为止。
4.将最后一次得到的余数作为最低位(LSB),依次排列之前得到的余数,即可得到对应的二进制数。
例如,将十进制数27转换为二进制:27 ÷ 2 = 13 (1)13 ÷ 2 = 6 (1)6 ÷ 2 = 3 03 ÷ 2 = 1 (1)1 ÷ 2 = 0 (1)因此,27的二进制表示为11011。
[C++]c++中⼆进制⽂件的创建与使⽤⼆进制⽂件和⽂本⽂件是不同的⽂件类型,因此在创建等⽅式也是不⼀样的使⽤⽂件⽅式见下表:"r"(只读)为输⼊打开⼀个⽂本⽂件"w"(只写)为输出打开⼀个⽂本⽂件"a"(追加)为追加打开⼀个⽂本⽂件"rb"(只读)为输⼊打开⼀个⼆进制⽂件"wb"(只写)为输出打开⼀个⼆进制⽂件"ab"(追加)为追加打开⼀个⼆进制⽂件"r+"(读写)为读/写打开⼀个⽂本⽂件"w+"(读写)为读/写创建⼀个⽂本⽂件"a+"(读写)为读/写打开⼀个⽂本⽂件"rb+"(读写)为读/写打开⼀个⼆进制⽂件"wb+"(读写)为读/写创建⼀个⼆进制⽂件"ab+"(读写)为读/写打开⼀个⼆进制⽂件void generateBin(string filename, int npattern ,int ninput, int noutput){FILE* file;file = fopen(filename.c_str(), "w");if (file == NULL){throw runtime_error("network: could not open " + string(filename) + " for writing");}fwrite(&npattern, sizeof(int), 1, file);fwrite(&ninput, sizeof(int), 1, file);fwrite(&noutput, sizeof(int), 1, file);float * input = new float[ninput];float * output = new float[noutput];float range = 1;for (int n = 0; n < npattern;n++){for (int i = 0; i < ninput; i++){input[i] = range * ((float)rand() / RAND_MAX - 0.5);}fwrite(input,sizeof(float),ninput,file);for (int o = 0; o < noutput; o++){output[o] = range * ((float)rand() / RAND_MAX - 0.5);}fwrite(output, sizeof(float), noutput, file);}if (fclose(file) != 0) {throw runtime_error("network: error on saving to " + string(filename));}delete input;delete output;}void readdata(){int ninput =0;int noutput = 0;int npatterns = 0;size_t data_read = 0;float* inputs = new float[ninput];float* targets = new float[noutput];string filename = "data.bin";FILE *file = fopen(filename.c_str(), "r");throw runtime_error("Cannot open file " + filename + " for reading");int ok =fread(&npatterns, sizeof(int), 1, file) &&fread(&ninput, sizeof(int), 1, file) &&fread(&noutput, sizeof(int), 1, file);cout << npatterns << " " << ninput << " " << noutput << endl;cout << "ninput is:" << ninput << endl;cout << "noutput is:" << noutput << endl;cout << "npatterns is:" << npatterns << endl;for (int i = 0; i < npatterns; i++) {cout << "load_patterns i:" << i << endl;data_read = fread(inputs, sizeof(float), ninput, file);cout << "need: " << ninput << " get: " << data_read << endl;if (data_read != ((size_t)ninput)) {cout << "Wrong file format " << endl;fclose(file);throw runtime_error("Wrong file format");}data_read = fread(targets, sizeof(float), noutput, file);if (data_read != ((size_t)noutput)) {cout << "Wrong file format " << endl;fclose(file);throw runtime_error("Wrong file format");}cout << "load_patterns i:" << i << endl;}delete inputs;delete targets;fclose(file);} 上⾯两段程序,试图创建⼀个⼆进制⽂件,并且向其中写⼊data,并且再在其中读出⼆进制数据。
二进制文件和文本文件的详细以及如何生成二进制文件?技术随笔2010-05-01 19:13:56 阅读226 评论0 字号:大中小订阅这个问题一直困扰了很多年,可能是我没有认真的去思考。
我相信很多人可能和我一样很纠葛,到底编译器也好,汇编器也好是如何工作的呢?到底怎么回事?为什么会运行呢?这是让我们这些看着windows 学习电脑的人真的很难去理解计算机的内部结构。
其实,这一切都只是障眼法,下面我就来给大家细细说说我对计算机的理解。
解答1:编译器是怎么回事?所谓编译器,顾名思义就是将一种文本格式转换成另一种文本格式。
比如将字符串echo "hello"; 转换成printf("hello"); 这其实是php语言转成c语言的一种表示。
这只是一种简单的描述,其实很大一部分的编译器是将源语言转换成了汇编语言。
下面我们来看看 C 语言中的经典hello word,通过gcc编译后生成的汇编是怎么回事。
c语言源码:#include<stdio.h>int main() {printf("hello world\n");}通过编译器后,编译器把这个翻译成了另一套字符串,其实就是汇编语言:.file "hello.c".section .rodata.LC0:.string "hello world".text.globl main.type main, @functionmain:leal 4(%esp), %ecxandl $-16,%esppushl -4(%ecx)pushl %ebpmovl %esp, %ebppushl %ecxsubl $4, %espmovl $.LC0, (%esp)call putsaddl $4, %esppopl %ecxpopl %ebpleal -4(%ecx), %espret.size main, .-main.ident "GCC: (GNU) 4.1.2".section .note.GNU-stack,"", @progbits这就是编译器做的工作了,其实这应该可以理解是吗,其实就是从一种字符串模式到了另一种字符串模式。
linux中各种文件类型普通文件(- regular file)(1)文本文件。
文件中的内容是由文本构成的,文本指的是ASCII码字符。
文件里的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有1和0),而文本文件中的数字本身应该被理解为这个数字对应的ASCII码。
常见的.c 文件, .h文件 .txt文件等都是文本文件。
文本文件的好处就是可以被人轻松读懂和编写。
所以说文本文件天生就是为人类发明的。
(2)二进制文件。
二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是就是真正的数字。
常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin)都是二进制文件。
(3)对比:从本质上来看(就是刨除文件属性和内容的理解)文本文件和二进制文件并没有任何区别。
都是一个文件里面存放了数字。
区别是理解方式不同,如果把这些数字就当作数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成文本字符,则就是文本文件。
(4)我们如何知道一个文件是文件文件还是二进制文件?在linux系统层面是不区分这两个的(譬如之前学过的open、read、write等方法操作文件文件和二进制文件时一点区别都没有),所以我们无法从文件本身准确知道文件属于哪种,我们只能本来就知道这个文件的类型然后用这种类型的用法去用他。
有时候会用一些后缀名来人为的标记文件的类型。
(5)使用文本文件时,常规用法就是用文本文件编辑器去打开它、编辑它。
常见的文本文件编辑器如vim、gedit、notepad++、SourceInsight等,我们用这些文本文件编辑器去打开文件的时候,编辑器会read读出文件二进制数字内容,然后按照编码格式去解码将其还原成文字展现给我们。
如果用文本文件编辑器去打开一个二进制文件会如何?这时候编辑器就以为这个二进制文件还是文本文件然后试图去将其解码成文字,但是解码过程很多数字并不对应有意义的文字所以成了乱码。
编程语言中的文件类型详解在编程中,文件类型是指文件的格式和结构,决定了文件的内容和如何处理。
不同的编程语言支持不同的文件类型,每种文件类型都有其特定的用途和功能。
本文将详细介绍几种常见的文件类型,以帮助读者更好地理解编程语言中的文件处理。
1. 文本文件(Text Files)文本文件是最常见的文件类型之一,它包含了以文本形式存储的字符数据。
文本文件通常以ASCII或Unicode编码存储,可以使用任何文本编辑器打开和编辑。
常见的文本文件扩展名包括.txt、.csv、.html等。
在编程中,文本文件常用于存储和处理结构化的数据。
例如,CSV(逗号分隔值)文件常用于存储表格数据,HTML文件用于网页的展示和布局。
通过读取和写入文本文件,程序可以从中提取信息、进行数据分析和生成报告。
2. 二进制文件(Binary Files)与文本文件不同,二进制文件包含了以二进制形式存储的数据。
这些文件不以可读的字符形式表示,而是以字节序列表示。
二进制文件可以包含任意类型的数据,如图像、音频、视频等。
常见的二进制文件扩展名包括.jpg、.mp3、.mp4等。
在编程中,处理二进制文件需要使用特定的库或工具。
例如,图像处理程序可以读取二进制图像文件,并对其进行编辑、调整和保存。
音频和视频处理程序可以解析二进制文件中的音频和视频数据,并进行播放或转码。
3. 可执行文件(Executable Files)可执行文件是一种特殊的二进制文件,它包含了计算机程序的机器语言代码。
这些文件可以直接在计算机上运行,执行特定的任务或操作。
不同的操作系统支持不同的可执行文件格式,如Windows上的.exe、Linux上的.out等。
编程语言中的编译器或解释器可以将源代码转换为可执行文件。
通过编译和链接过程,源代码被转换为机器语言指令,形成可执行文件。
这些文件可以在计算机上独立运行,无需编程语言的运行环境。
4. 数据库文件(Database Files)数据库文件是一种用于存储和组织数据的文件类型。
C#的⼆进制⽂件操作及汉字编码转换1.数值应保存在⼆进制⽂件⾸先列举⽂本、⼆进制⽂件的操作(读写)⽅法:⽅式1:1//⽂本⽂件操作:创建/读取/拷贝/删除2using System;3using System.IO;4class Test5 {6string path = @"f:/t.txt";7public static void Main()8 {9//创建并写⼊(将覆盖已有⽂件)10if (!File.Exists(path))11 {12//StreamWriter m=new13//StreamWriter(path,true,Encoding.Default,1);//ASCII,1 Encoding.Default:即//UTF-8编码这样就可以指定编码⽅式14using (StreamWriter sw = File.CreateText(path))15 {16 sw.WriteLine("Hello");17 }18 }19//读取⽂件20using (StreamReader sr = File.OpenText(path))21 {22string s = "";23while ((s = sr.ReadLine()) != null)24 {25 Console.WriteLine(s);26 }27 }28//删除/拷贝29try30 {31 File.Delete(path);32 File.Copy(path, @"f:/tt.txt");33 }34catch (Exception e)35 {36 Console.WriteLine("The process failed: {0}", e.ToString());37 }38 }39 }⽅式2:1//流⽂件(⼆进制)操作2private const string name = "Test.data";3public static void Main(String[] args)4 {5//打开⽂件() ,或通过File创建⽴如:fs = File.Create(path, 1024)6 FileStream fs = new FileStream(name, FileMode.CreateNew);7//转换为字节写⼊数据(可写⼊中⽂)8 Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");9//字节数组,字节偏移量,最多写⼊的字节数10 BinaryWriter w = new BinaryWriter(fs);11//设置要写⼊的偏移量12 fs.Position=fs.Length;13// fs.Write(info, 0, info.Length); 这个也可以14 w.Close();15 fs.Close();16//打开⽂件17 fs = new FileStream(name, FileMode.Open, FileAccess.Read);18//读取19 BinaryReader r = new BinaryReader(fs);20for (int i = 0; i < 11; i++)21 {22 Console.WriteLine(r.ReadInt32());23 }24 w.Close();25 fs.Close();在将⼀系列⼆进制数如⽅式1写⼊到file.txt(⼆进制)⽂件后,打开file.txt后显⽰的数据⼆进制数有些错误,有些正确。
二进制文件和文本文件的详细以及如何生成二进制文件1.文本文件:
文本文件的特点:
-文本文件的大小相对较小,因为它们使用了较少的字节来存储字符
信息。
-文本文件可以通过简单的文本读写操作进行处理。
2.二进制文件:
-二进制文件不是人类可读的,因为它们包含了非文本的二进制数据。
-二进制文件的大小通常比文本文件要大,因为它们需要更多的字节
来存储非文本数据。
如何生成二进制文件:
生成二进制文件可以通过编程语言或特定的工具来完成,下面是一些
常见的方法:
1.使用编程语言:
可以使用编程语言如Python、Java或C++来生成二进制文件。
这些
编程语言提供了操作文件和字节的功能,可以将数据以二进制格式写入文件。
例如,Python中的open函数可以以二进制模式打开文件,然后使用write方法将数据写入文件。
2.使用特定的工具:
要生成二进制文件,首先需要确定要存储的数据类型和格式,然后选择相应的工具或编程语言进行处理。
总结:
二进制文件和文本文件是计算机中常见的文件类型。
文本文件由字符组成,是人类可读的,大小相对较小;而二进制文件由二进制数据组成,存储非文本数据,不是人类可读的,大小通常较大。
生成二进制文件可以通过编程语言或特定的工具来实现。
二进制方式读取文本文件的方法-概述说明以及解释1.引言1.1 概述二进制方式读取文本文件是一种在计算机科学中常见的操作方法。
它通过以0和1的二进制形式来表示数据,与传统的基于字符的文本文件读取方式不同。
本文将讨论二进制方式读取文本文件的基本概念、方法和应用,以及总结其优势和局限性,展望未来发展方向。
通过深入了解二进制方式读取文件的相关知识,读者将能够更好地理解这一重要的文件操作方式,并且能够更加灵活和高效地进行文件读取和处理。
1.2 文章结构文章结构部分:本文将分为三个主要部分:引言、正文和结论。
在引言部分中,将简要介绍本文要讨论的主题,并说明文章的结构和目的。
在正文部分中,将分为三个部分来讨论二进制读取文件的基本概念、方法和应用。
在结论部分中,将总结二进制读取文件的优势,并讨论其局限性和未来发展的展望。
通过这样的结构,读者能够清晰地了解本文的内容并对二进制读取文件有更深入的理解。
的内容1.3 目的本文的主要目的是探讨二进制方式读取文本文件的方法。
通过深入分析二进制读取文件的基本概念、方法和应用,旨在帮助读者更深入地了解和掌握二进制文件读取的技术和优势。
同时,也将探讨二进制方式读取文件的局限性,并展望其未来的发展方向。
通过本文的阐述,读者将能够更全面地认识和理解二进制文件读取的重要性、应用价值以及可能的发展趋势,为软件开发和数据处理提供更多的思路和参考。
2.正文2.1 二进制读取文件的基本概念二进制读取文件是指以二进制的形式来解析和读取计算机文件的内容。
在计算机中,一切数据都是以二进制形式存储的,包括文本文件。
因此,通过二进制方式读取文件可以更加直接和高效地获取文件中的数据。
在二进制读取文件的过程中,文件中的数据被以连续的字节序列方式读取,并且可以以不同的方式进行解析和处理。
与文本方式读取文件不同,二进制方式读取文件直接操作文件的底层数据,可以更加自由地处理文件中的各种数据类型,包括整数、浮点数、字符串等。
一).一般问题二进制文件与我们通常使用的文本文件储存方式有根本的不同。
这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。
因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。
这样的编辑器有很多,在我们的CVF 附带的集成开发环境下就可以(将二进制文件拖动到IDE 窗口后松开)。
Visual Studio 2005 也是可以的。
(不过需要在File 菜单下Open,File)另外推荐一款使用较多的软件,叫做UltraEdit(以下简称UE)。
是很不错的文本编辑器,也能做十六进制编辑器使用。
为什么要用十六进制编辑器?而不用2 进制呢?因为2 进制实在太小,书写起来会很长,很不直观。
而我们的计算机把8 位作为一个字节。
刚好2 ** 8 = 256 = 16 ** 2。
用8 位2 进制表达的数,我们用2 个十六进制数据来表达,更直观和方便。
二).文件格式所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。
1).文本文件文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。
所以使用比较广泛。
通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。
实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或Tab 间隔,行是用回车和换行符间隔。
以ANSI 编码(使用较多)的文本文件来说,例如我们储存如下信息:引用:101112需要的空间是:3 行×每行2 个字符+ 2 个回车符+ 2 个换行符= 10 字节。
文本文件储存数据是有格式,无数据类型的。
比如10 这个数据,并不指定是整型还是实型还是字符串。
它有长度,就是2,两个字节。
储存时计算机储存它的ASCII 码:31h,30h。
(十六进制表示)。
回车符是:0Dh,换行符:0Ah。
因此,这个数据储存是这样的:引用:31 30 0D 0A 31 31 0D 0A 31 32(红色为回车符和换行符) 31h 30h 就是10,31h 31h就是11,31h 32h 就是12。
文件处理方法文件处理是计算机科学中非常重要的一部分,涉及到对文件的读取、写入、修改、删除等操作。
文件处理方法可以分为文本文件处理和二进制文件处理两种。
一、文本文件处理方法1. 文件的读取:使用文件读取方法可以将文本文件中的内容读入到程序中进行处理。
常见的文件读取方法有按字符读取、按行读取和按词读取等。
读取文件时,可以使用循环结构逐行读取文件内容,并将读取到的内容存储在变量中,以便后续处理。
2. 文件的写入:文件的写入操作可以将程序中的数据写入到文本文件中。
常见的文件写入方法有按字符写入和按行写入等。
写入文件时,可以使用循环结构逐行写入数据,也可以使用特定的写入方法将数据写入到指定位置。
3. 文件的修改:文件的修改操作可以对文本文件中的内容进行修改。
常见的文件修改方法有替换指定字符串、插入和删除等操作。
修改文件时,可以使用字符串替换方法将指定字符串替换为新的字符串,也可以使用插入和删除方法对文件中的内容进行增加或删除。
4. 文件的删除:文件的删除操作可以将指定的文本文件从磁盘上删除。
删除文件时,可以使用特定的删除方法将文件从指定位置删除,也可以使用循环结构逐行读取文件内容并判断是否需要删除。
二、二进制文件处理方法1. 文件的读取:二进制文件的读取与文本文件的读取方法略有不同。
读取二进制文件时,可以使用文件流的方式将文件中的二进制数据读入到程序中进行处理。
读取二进制文件时,需要根据文件的格式和结构解析文件中的数据,并将其转化为程序可以理解的数据类型。
2. 文件的写入:二进制文件的写入操作与文本文件的写入方法也有所不同。
写入二进制文件时,需要将程序中的数据按照文件的格式和结构进行编码,并将其写入到文件中。
常见的写入方法有直接写入和按块写入等。
3. 文件的修改:二进制文件的修改操作与文本文件的修改方法类似,但需要注意文件的格式和结构。
修改二进制文件时,需要对文件中的数据进行解码、修改和编码等操作。
4. 文件的删除:二进制文件的删除操作与文本文件的删除方法相同。
二进制文件格式
二进制文件格式是计算机中的一种文件格式,它将数据以二进
制的方式进行存储和传输。
与之相对的是文本文件格式,文本文
件格式以文本形式进行存储和传输。
二进制文件格式可以用来存储各种类型的数据,如图像、音频、视频、程序等。
它能够将数据以最小的存储空间存储,同时也能
够提高数据的读取速度。
因此,当需要存储大量数据时,二进制
文件格式是一个非常好的选择。
下面是二进制文件格式的列表:
1. 头部信息:二进制文件格式通常有一个头部信息,用来描述
文件格式、文件类型、文件大小等信息。
这些信息可以帮助解析
二进制文件。
2. 数据段:数据段是二进制文件中存储数据的部分。
数据段可
以按照不同的格式进行存储,如字节、整数、浮点数等。
数据段
的大小可以根据需要进行调整。
3. 尾部信息:尾部信息通常包含校验和等检验信息,用来确保
数据的完整性和正确性。
4. 压缩算法:二进制文件通常采用压缩算法来减小文件的大小,提升文件的读取效率。
常见的压缩算法有Deflate、LZ77、LZ78
等。
5. 加密算法:对于一些敏感的二进制文件,可以采用加密算法来保护数据的安全。
对称加密算法如AES和DES是常用的加密算法。
总之,二进制文件格式作为一种计算机文件格式,具有存储空间小、读取速度快等优点。
它广泛应用于计算机系统中,例如数据存储、文件传输、程序编写等方面。
二进制文件解析
二进制文件解析是计算机科学中的一种重要技术,它的基本思想是从二进制数据流中提取结构化信息。
在几乎所有的计算机系统中,有一种文件类型(称为二进制文件),用于存储着有结构的数据,而
这种文件的解析就叫二进制文件解析。
二进制文件解析涉及到三个基本步骤:第一,了解文件的结构;第二,解码二进制文件;第三,将解码后的文件转换为可读的文本。
首先,在解析二进制文件之前,我们需要了解它的结构,也就是字节、词和句子的基本元素。
一个字节由八位构成,一个词由若干个字节构成,而句子由一系列的词构成。
字节和词的结构直接决定了整个文件的内容以及其结构组成,因此要想正确解析二进制文件,我们必须先了解它的结构。
其次,解码二进制文件的过程,涉及到从每个字节中解码出相应的数据元素,将每个字节的十六进制表示转换成有意义的数据。
这个过程需要用户了解每个字节和词的结构,以及每个字节表示的具体数据类型。
最后,将解码后的文件转换为可读的文本,这需要程序员设计一个可以解析二进制文件的程序。
以字符串格式显示二进制文件内容最常见的方法是使用特定的程序,将每个字节转换成其对应的可读字符。
总之,二进制文件解析是一项重要的技术,它涉及到对二进制数据流中的内容和结构进行解析,以及将解析后的文件转换成可读的文本文件。
虽然它很复杂,但是掌握了二进制文件解析技术,可以帮助
我们更好地理解二进制文件的内容和结构,从而更好地处理各种信息。
C语言入门教程-二进制文件2009年07月29日14:24[导读] 二进制文件二进制文件非常类似于结构体数组,只不过这些结构体被保存在一个磁盘文件而非内存数组中。
因为是使用磁盘保存二进制文件中的结构体,所以您可以创关键词:c语言入门二进制文件二进制文件非常类似于结构体数组,只不过这些结构体被保存在一个磁盘文件而非内存数组中。
因为是使用磁盘保存二进制文件中的结构体,所以您可以创建非常庞大数目的结构体(只受可用磁盘空间的限制)。
它们还是永久性的,并且可以随时使用。
惟一的缺点是磁盘存取会造成延迟。
二进制文件与文本文件有两个不同的特点:您可以立即跳至文件中的任一结构体,类似于数组的随机存取。
您可以随时改变文件中任一处结构体的内容。
二进制文件通常还具有比文本文件更短的存取时间,因为文件记录的二进制映像是直接从内存传送至磁盘的(或相反的方向)。
对于文本文件,所有数据都要反复转换成文本,而这需要花费时间。
C所支持的“结构体文件”概念十分简洁。
某文件被打开后,您可以读取一个结构体,写入一个结构体,或移动至文件中的任一结构体。
这种文件模型要求有一个文件指针的概念。
打开文件时,指针指向0号记录(文件的第一个记录)。
任何读操作都读取当前被指向的结构体,并将指针指向下一个结构体。
任何写操作都向当前被指向的结构体写入数据,并将指针指向下一个结构体。
移动操作将文件指针移至指定的记录。
请记住C总是将文件内容视为从磁盘读入内存或从内存写入磁盘的字节块。
C使用文件指针,但指针可以指向文件中的任一字节。
因此您需要自己管理好指针的位置。
下面的程序可以说明以上概念:#includestruct rec{int x,y,z;};int main(){int i,j;FILE *f;struct rec r;f=fopen("junk","w");if (!f)return 1;for (i=1;i<=10; i++){r.x=i;fwrite(&r,sizeof(struct rec),1,f); }fclose(f);f=fopen("junk","r");if (!f)return 1;for (i=1;i<=10; i++){fread(&r,sizeof(struct rec),1,f);printf("%d\n",r.x);}fclose(f);printf("\n");f=fopen("junk","r");if (!f)return 1;for (i=9; i>=0; i--){fseek(f,sizeof(struct rec)*i,SEEK_SET);fread(&r,sizeof(struct rec),1,f);printf("%d\n",r.x);}fclose(f);printf("\n");f=fopen("junk","r");if (!f)return 1;fseek(f,0,SEEK_SET);for (i=0;i<5; i++){fread(&r,sizeof(struct rec),1,f);printf("%d\n",r.x);fseek(f,sizeof(struct rec),SEEK_CUR);}fclose(f);printf("\n");f=fopen("junk","r+");if (!f)return 1;fseek(f,sizeof(struct rec)*3,SEEK_SET);fread(&r,sizeof(struct rec),1,f);r.x=100;fseek(f,sizeof(struct rec)*3,SEEK_SET);fwrite(&r,sizeof(struct rec),1,f);fclose(f);printf("\n");f=fopen("junk","r");if (!f)return 1;for (i=1;i<=10; i++){fread(&r,sizeof(struct rec),1,f);printf("%d\n",r.x);}fclose(f);return 0;}此程序使用了一个名为rec的结构体类型,但您也可以使用任一种结构体类型。
今天看别人写的程序, 有一点不是很明白, 就是在mfc的程序中利用CFile在写文件时是怎么区别二进制文件和文本文件的.首先说一下二进制文件和文本文件的区别:从网上找到一篇文章, 写的挺基础, 通俗易懂的, 和大家分享:现在搞懂了文本文件与二进制文件之间的关系啦.我们可以利用二进制编辑器查看文本文件.上图红框中的左边是十六进制显示的,右边是文本(ascii在程序中有这么一句:开始我不明白为什么要写两个字节的"fffe", 后才上网查了一下资料才发现,这与编码方式有关.UTF的字节序和BOMUTF-8以字节为编码单元,没有字节序的问题。
UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。
例如收到一个"奎"的Unicode编码是594E,"乙"的Unicode编码是4E59。
如果我们收到UTF-16字节流"594E",那么这是"奎"还是"乙"?Unicode规范中推荐的标记字节顺序的方法是BOM。
BOM不是"Bill Of Material"的BOM表,而是Byte Order Mark。
BOM是一个有点小聪明的想法:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。
而FFFE在UCS 中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
二进制读写文件二进制读写文件是计算机中常用的一种文件读写方式。
与文本文件不同,二进制文件中存储的是计算机能够直接识别的二进制数据,而不是人类可读的字符。
因此,二进制读写文件需要使用特定的方法和工具来进行操作。
在计算机中,所有的数据都是以二进制形式存储的。
文本文件中的字符也是以二进制形式存储的,但是它们被解释为人类可读的字符。
而二进制文件中存储的是计算机能够直接识别的二进制数据,例如图像、音频、视频等文件。
二进制读写文件的操作需要使用特定的工具和方法。
在Python中,可以使用内置的open函数来打开文件,并指定文件的打开模式为二进制模式。
例如,要以二进制模式打开一个名为“test.bin”的文件,可以使用以下代码:```f = open("test.bin", "rb")```在这个例子中,打开模式为“rb”,其中“r”表示读取模式,“b”表示二进制模式。
这样打开文件后,就可以使用read方法来读取文件中的二进制数据。
例如,要读取文件中的前10个字节,可以使用以下代码:```data = f.read(10)```这个例子中,read方法的参数为10,表示读取10个字节的数据。
读取后的数据存储在变量data中。
除了读取文件,还可以使用write方法来写入二进制数据到文件中。
例如,要将一个字节串写入到文件中,可以使用以下代码:```f.write(b"\x01\x02\x03\x04")```这个例子中,write方法的参数为一个字节串,表示要写入的数据。
在Python中,字节串需要以“b”开头,表示这是一个二进制数据。
二进制读写文件在计算机中应用广泛,特别是在处理图像、音频、视频等文件时。
通过使用二进制读写文件的方法,可以更加高效地读取和写入这些文件中的数据。
二进制文件和文本文件的详细以及如何生成二进制文件?技术随笔2010-05-01 19:13:56 阅读226 评论0 字号:大中小订阅这个问题一直困扰了很多年,可能是我没有认真的去思考。
我相信很多人可能和我一样很纠葛,到底编译器也好,汇编器也好是如何工作的呢?到底怎么回事?为什么会运行呢?这是让我们这些看着windows 学习电脑的人真的很难去理解计算机的内部结构。
其实,这一切都只是障眼法,下面我就来给大家细细说说我对计算机的理解。
解答1:编译器是怎么回事?所谓编译器,顾名思义就是将一种文本格式转换成另一种文本格式。
比如将字符串echo "hello"; 转换成printf("hello"); 这其实是php语言转成c语言的一种表示。
这只是一种简单的描述,其实很大一部分的编译器是将源语言转换成了汇编语言。
下面我们来看看 C 语言中的经典hello word,通过gcc编译后生成的汇编是怎么回事。
c语言源码:#include<stdio.h>int main() {printf("hello world\n");}通过编译器后,编译器把这个翻译成了另一套字符串,其实就是汇编语言:.file "hello.c".section .rodata.LC0:.string "hello world".text.globl main.type main, @functionmain:leal 4(%esp), %ecxandl $-16,%esppushl -4(%ecx)pushl %ebpmovl %esp, %ebppushl %ecxsubl $4, %espmovl $.LC0, (%esp)call putsaddl $4, %esppopl %ecxpopl %ebpleal -4(%ecx), %espret.size main, .-main.ident "GCC: (GNU) 4.1.2".section .note.GNU-stack,"", @progbits这就是编译器做的工作了,其实这应该可以理解是吗,其实就是从一种字符串模式到了另一种字符串模式。
但是很多人一定和我一样在思考,字符串模式的转变我会,但是从字符串转到二进制如何转其实我们的大脑真的被这些东西所迷惑了,都错了,字符串是什么?字符串其实也是二进制啊,只不过字符串它不能执行而已。
当我们查看字符串的16进制的时候,其实和二进制的16进制一样,只是我们人为的给字符串赋予了一个abcde...这样的一层显示方式。
而二进制码之所以没有这层皮,是因为他有了另一层含义。
汇编器其实和编译器做的动作是一样的。
只是抽象的层次不同。
这里有点绕是吗?其实不绕。
当我们编译的时候,我们发现了文本文件要比可执行文件小很多,文本文件比汇编文件小6.5倍。
而比二进制要小70倍左右,也就是说一个60字节的文本文件编译成汇编是400个字节左右,再生成二进制大概是4k左右了。
那这到底说明了什么呢?其实是这样的,所谓的二进制其实和我们一般说的ASCII 中的FF,0F是一样的,只不过二进制符合的不是ASCII的这套显示或者作用标准,它采用的是计算机cpu的处理标准。
比如\x41 在ASCII中表示的是A,而到了计算机cpu那里他可能是另一个意思,那么你又会觉得奇怪,那么为什么文本可以显示,而二进制却不能呢?因为文本文件是通过文本文件查看器去重新给文本文件进行处理然后显示的,并不是我们想当然的"直接打开"就能看见,至少也要通过notepad吧?!而二进制进行运行,则是不通过其他软件的,直接丢给cpu的(当然,你也可以用notepad 打开二进制文件,只不过显示的是杂乱的ASCII字符和控制符)。
有些人又会问了,错了吧,windows的二进制丢到linux下能用吗?其实这不是错,windows的二进制丢到linux下之所以不能运行,并不是二进制本身的问题,而是因为linux里没有windows的库,二进制文件运行的时候缺少必要的库才无法运行。
所谓的库,其实就是调用系统资源或者本身就是系统资源的一种程序包(比如显示,接受键盘,窗口啊,等等等等)。
和二进制代码有关的唯一的一方面其实就是cpu。
因为不同的cpu处理的二进制的指令是有区别的。
其实,说穿了,所谓的计算机软件,就是对计算机硬件的一次次的抽象,让它更接近于人类的思考方式和使用习惯。
这其实和我们生活中的很像,比如,我们把硬件比作是树木(当然硬件的材料属性并非木头的属性,它的属性比木头要更全面,可以很坚硬可以很柔软),那么二进制就是木头,可是木头毕竟只是木头,虽然是很好的材料但是单单一颗木头有什么用呢?于是,就有一些最早的程序员用手去处理这个木头,做出了一些简单的凳子椅子。
于是程序员们就像,不如用做出一个木头匕首来切木头,这样不是比手抓更好吗(我前面说了硬件的属性比木头更全面,可以很硬也可以很软)?汇编就好比是这么一个匕首。
用着用着,人们觉得匕首砍木头,虽然可以做出很精细的东西,但是砍大件不行,于是就用匕首加上手工制作出了一把短刀,这就是C语言吧,然后他们在短刀里增加了一些齿牙,让比短刀更有杀伤力,这就是C++。
可以他们发现,这个短刀虽然好,但是它只能砍一种树(因为这种树的木头做的短剑只能砍这种树),于是他们用两种木头各做了一面做了一把短剑,短剑虽然有两面,但是剑的杀伤力明显比刀要小。
这就是我们说的Java。
那么操作系统是什么呢?操作系统我们可以理解为一个工具包,这个说明书里面写了各种用木头制作工具的说明并且提供了很多基础工具和小配件(我们看起来是不是很像木匠了,桌面上放了许多用木头做的小工具)。
然后我们要做的就是用这些配件和工具来做出我们的板凳啊,家具啊,各种各样的东西。
二进制文件和文本文件详解2010-07-30 19:10:00| 分类:C++ | 标签:二进制文件存放文件换行文本|字号大中小订阅对于文件操作中的二进制文件和文本文件的读写,相信还有很多人有疑问,这两种方式有什么不同呢?首先我们记住文件只是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式,对于文本文件来说,它只是一种特殊形式的文件,它所存放的每一个字节都可以转换为一个可读的字符,就是说文本文件存放数据时,存放的是字符的ASCII码。
有点需要注意,按照文本方式向文件中写入数据时,遇到“换行”符,则会转换为“回车-换行”符,存储,即当存放10(换行符)时,在文件中会存放13 (回车)和10(换行),同时存储的文件就多了一个字节了,而读取文件的时候,遇到13和10,也会合成ASCII10即换行符读取,而当按照二进制文件模式向文件中写入数据时,就会按照数据在内存中的存储形式原样输出到文件中,即存放10时,不会转换为13和10,所以如果以二进制方式向文件写入10时,当以文本方式(例如记事本)打开文件时,看到的会是一个小黑快,而不是换行符,因为在文本文件中,只有遇到13 和10的组合时才会转换为换行符。
为了加深理解,我们来看一道常见的面试题:给你一个整数,例如123456,将这个整数保存到文件中,要求当用记事本打开文件时,显示的是123456。
应该怎么想这题呢?首先记事本是属于文本模式的,所以会将数据作为ASCII码,然后转换为对应的字符,所以在存入数据的时候必须是存放123456这几个字符对应的ASCII码;看看123456各个字符对应的ASCII码:“1” ->49;"2" ->50;......."6" ->54;所以在存入数据的时候,我们应该存入的是49-54几个数字,那样在存的时候我们就有不同选择了。
1、创建一个int型数组,把49-54几个数字分别赋给数组中的元素,2、创建char型数组,直接把1-6几个字符赋给数组元素。
这样结果都是正确的。
最后总结一下,二进制文件存放的就是数据的原始形式,而文本文件存放的就是数据的ASCII码。
用二进制方式存放的数据,可以用文本模式打开,相反亦然。
但是,我们要避免这样做,因为就想上面所说的,当遇到10的时候,这两种模式的处理方式就不一样,所以我们应该用什么模式存放的数据就用什么模式打开。
关于linux和windows的CR, LF, CR/LF 回车换行问题博客分类:•NO分类在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.Dos和windows:采用回车+换行CR/LF表示下一行.UNIX/Linux :采用换行符LF表示下一行.MAC OS :采用回车符CR表示下一行.CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;LF用符号'\n'表示, 十进制ASCII代码是10, 十六制为0x0A.所以Windows平台上换行在文本文件中是使用0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。
在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时,有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错。
很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换。
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换。
经过这种传输的文件字节数可能会发生变化。
如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。
表一:表二:所以在用println函数的时候,导致的换行在不同操作系统中可能不一样,在windows下表现的是“\r\n”,使用的时候要注意。