环境
- 2022-05-10
- Windows 10
- 开发工具 VS 2022
- 一个 .txt 文件
任务
-
任务
:学习二进制文件基本读写操作 -
参考资料
:- C语言文件操作:C语言文件操作完全攻略
- Python读取二进制文件:python处理二进制文件(.bin)
- Java读取二进制文件:java读取文件:二进制文件 - Michael2397 - 博客园
-
作业
:编程读取下面文件的内容,分别读取文件头部64个字节和文件尾部64个字节,并使用十六进制的形式格式化输出。
思路
说实话,刚开始看到是真的不知道从哪下手,即便看了大大提供的资料,后来结合百度,再一起看大大的资料,自己再慢慢操作,终于思路一点一点的清晰起来了。
- 第一次:没思路
- 第二次:既然要读出文件头尾各64个字节,那么需要 打开文件、读取、定位、转16进制,关闭文件。
- 第三次:以流的形式打开文件、以字节的方式读取指定内容、用Seek函数定位、 string.Format("{0:X2} ", b[i]);这个语句将字节b[i]转为16进制数据。
参考资料
- 为什么要用二进制文件1 ==》文件的每个字符都是经过了特殊处理(比如转成ASCII码)然后再存储为二进制
- C# 读取文本文件
- C# 之 按字节读写文件
- Seek函数定位==》Seek()的第一个参数表示偏移量,均指从起点开始,往后面进行偏移,第二个参数表示起点。
- C# byte数组与16进制字符串相互转化
- C# 16进制与字符串、字节数组之间的转换 (转载)
基础知识
- ASCII码常用对照表===》字符1的ASCII码是49;2是50…9是57
- 16进制在线查看对照==》点新增档案=》空的档案=》在右边空白档copy放上自己的内容=》弹出框,看着说明选吧。
- 一个字节 等于 八位 《====》1 byte = 8 bit;一个数字(属于字符)基本就按一个字节来算。但汉字好像不是一个字节,这个百度下吧。
实践
// 1.打开文件
// Stream为输入和输出的类型提供通用接口,并将编程器与操作系统和底层设备的特定详细信息隔离开。
// 例如,MemoryStream处理内存中(内存条,就一般电脑4G/8G/16G的那个东西)的数据,FileStream处理文件中(我的理解是存在硬盘中的数据)的数据。
// 但是处理文件中的数据,首先也是需要将数据读取到内存中进行操作的,这对内存来说就是一个写入的过程。
using System.Text;
// Test这个文件在我的当前目录下
// 读取到 content 中是正常的,单打印出来 乱码
var path = "Test.txt";
// 打开文件,或者说加载到内存中?
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
// 创建字节数组来存储读到的数据
int n = (int)fs.Length;
byte[] b = new byte[n];
// Seek函数就是用来定位的,跟C里的指针差不多
// 读取字节中的 前10个字节 和 后10个字节
int r = fs.Read(b, (int)fs.Seek(0, SeekOrigin.Begin), 10);
r = fs.Read(b, (int)fs.Seek(-10, SeekOrigin.End), 10);
for (int i = 0; i < b.Length; i++)
{ // 按16进制形式打印出来
Console.WriteLine(string.Format("{0:X2} ", b[i]));
}
问题
- 文件读取为字节的时候,我的txt里只有1-9数字加8个空格,长度是17,但我用FileStream读取到的却是20。一位群里的大佬解答说:“Windows创建文件时,一般会默认是utf-8 with bom格式的,会在文件头里插入几个字符做标识。可以修改打开的参数。”
- 我的文件里的数据是“1 2 3 4 5 6 7 8 9”。我的理解是:Seek(5, SeekOrigin.Begin),±5 相当于光标向左还是向右移动,+向右,-向左。Begin相当于从第0个字符开始,向右读取5个字符==》"239 187 191 49 32 ";Current相当于从当前位置向右读取5个字符;End相当于从末尾开始,向右读取5个字符==》“57 32 56 32 55”,其实不会报错,因为只是虚报一个位置,但加上读取fs.Read(b, (int)fs.Seek(5, SeekOrigin.End), 5);就会报错(Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection),因为后面没有字符了,如果改成-5,就不会报错了,因为前面还有字符。文本里的字节读取是按ASCII读取的
- 文本里的字节读取是按ASCII读取的
- 文本里的字节读取是按ASCII读取的
- 文本里的字节读取是按ASCII读取的
总结
自己看资料的时候不太细心,其实有些问题本来自己该知道的,比如说,文本文件读取的时候,例如TXT,其内容(字符),会先转成ASCII码,再转成字节,然而我好似被下了将头,其实是自己没有好好思考啦。