做一个工具1

环境

  • 2022-05-10
  • Windows 10
  • 开发工具 VS 2022
  • 一个 .txt 文件

任务

思路

说实话,刚开始看到是真的不知道从哪下手,即便看了大大提供的资料,后来结合百度,再一起看大大的资料,自己再慢慢操作,终于思路一点一点的清晰起来了。

  • 第一次:没思路
  • 第二次:既然要读出文件头尾各64个字节,那么需要 打开文件、读取、定位、转16进制,关闭文件。
  • 第三次:以的形式打开文件、以字节的方式读取指定内容、用Seek函数定位、 string.Format("{0:X2} ", b[i]);这个语句将字节b[i]转为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]));
}

问题

  1. 文件读取为字节的时候,我的txt里只有1-9数字加8个空格,长度是17,但我用FileStream读取到的却是20。一位群里的大佬解答说:“Windows创建文件时,一般会默认是utf-8 with bom格式的,会在文件头里插入几个字符做标识。可以修改打开的参数。”
  2. 我的文件里的数据是“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读取的
  3. 文本里的字节读取是按ASCII读取的
  4. 文本里的字节读取是按ASCII读取的
  5. 文本里的字节读取是按ASCII读取的

总结

自己看资料的时候不太细心,其实有些问题本来自己该知道的,比如说,文本文件读取的时候,例如TXT,其内容(字符),会先转成ASCII码,再转成字节,然而我好似被下了将头,其实是自己没有好好思考啦。

猜你喜欢

转载自blog.csdn.net/qq_41128526/article/details/124686327