尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

小学生学C++编程语法知识(打开神秘文件:用十六进制编辑器看见文件里的 0 和 1)

小学生学C++编程语法知识(打开神秘文件:用十六进制编辑器看见文件里的 0 和 1) 一、先问同学们一个问题平时我们看到一个.txt文件打开以后是Hello看到一张图片打开以后是一张照片。那么问题来了计算机眼里的文件到底是什么答案其实非常简单文件本质上就是一串二进制数据也就是很多个 0 和 1。例如01001000 01100101 01101100 01101100 01101111这串二进制数据计算机可以把它解释成Hello所以可以告诉大家文件不是“文字”“图片”或者“视频”本身。文件本质上只是一串 0 和 1。我们看到的文字、图片、音乐只是计算机按照不同规则解释这些 0 和 1 后得到的结果。二、普通文本编辑器为什么看不到二进制例如我们创建一个hello.txt里面写ABC用记事本打开ABC孩子可能会问“不是说文件里面是 0 和 1 吗为什么我看到的是 ABC”这是因为记事本帮我们把二进制翻译成我们人类能看懂的文字了。就像计算机语言 01000001 01000010 01000011 ↓ 翻译 人类语言 A B C所以普通文本编辑器实际上是一个“翻译员”三、“十六进制编辑器”如果想直接观察文件里面的数据可以使用Hex Editor十六进制编辑器它也叫Hex Editor / 十六进制编辑器 / 二进制编辑器这里特别要给大家解释一个容易产生的误解“十六进制编辑器”是不是只能看十六进制不是。它看到的其实就是文件中的原始字节byte只不过为了方便程序员阅读它通常把一个字节显示成两个十六进制数字。例如01000001二进制01000001转换成十六进制41所以我们经常会看到41 42 43实际上就是01000001 01000010 01000011也就是A B C四、推荐同学们使用什么工具对于初学者我比较推荐① HxD这是 Windows 上非常经典的十六进制编辑器。HxD 官方网站它特别适合用来学习二进制文件十六进制字节ASCII文件头文件结构而且界面非常直观。五、打开一个文件看看我们可以先创建一个非常简单的文件hello.txt里面输入ABC保存。然后用 HxD 打开。孩子可能会看到类似41 42 43旁边还可能看到ABC这时候就非常适合停下来问孩子为什么左边是 41 42 43右边却是 ABC六、带同学们一起破解 41 42 43我们来看看41 42 43这是十六进制。一个十六进制数41实际上代表一个字节01000001而 ASCII 中01000001 A 01000010 B 01000011 C所以41 42 43就是A B C可以画成这样文件 │ ├── 41 ───→ 01000001 ───→ A │ ├── 42 ───→ 01000010 ───→ B │ └── 43 ───→ 01000011 ───→ C这时候大家就真正理解了所谓“文件里的文字”其实就是一串数字。七、为什么我们不直接显示 0 和 1这是一个非常好的问题。假设文件里面有8个字节用二进制显示01001000 01100101 01101100 01101100 01101111 ...一个字节要写8个二进制数字如果文件很大就会非常非常长。例如1 MB大约有1,048,576 个字节如果全部写成二进制1,048,576 × 8就是8,388,608个 0 和 1我们人类看起来会非常痛苦。所以计算机专业人员通常使用十六进制一个字节01001000只需要写成48是不是短很多所以二进制最接近计算机。十六进制最方便人类观察二进制。这是非常重要的一个知识点。八、认识 Hex Editor 的三个区域打开 HxD 后通常可以看到类似这样的结构地址 十六进制数据 ASCII 00000000 41 42 43 44 45 46 47 48 ABCDEFGH 00000008 49 4A 4B 4C 4D 4E 4F 50 IJKLMNOP可以把它想象成三个窗口┌──────────┬───────────────────────┬─────────────┐ │ 地址 │ 二进制数据 │ 人类看到的 │ ├──────────┼───────────────────────┼─────────────┤ │ 00000000 │ 41 42 43 44 45 ... │ ABCDE... │ │ 00000010 │ 10 FF 3A 82 ... │ ... │ └──────────┴───────────────────────┴─────────────┘第一部分地址例如00000000 00000001 00000002 ...表示这个字节在文件的什么位置。第二部分十六进制例如41 42 43这才是文件真正存储的数据。第三部分ASCII例如ABC这是工具帮我们翻译后的结果。九、最有意思的实验自己修改文件这个实验非常推荐。我们刚才有ABC十六进制41 42 43那么我们把41改成44保存。再用记事本打开。你猜会发生什么答案DBC为什么因为41 → A 42 → B 43 → C 44 → D所以41 42 43变成44 42 43也就变成D B C这时候同学们会突然发现原来我真的可以直接修改文件里的“底层数据”这比单纯讲概念有意思得多。十、再做一个“图片实验”这次可以找一张小图片例如test.png用十六进制编辑器打开。你会看到大量类似89 50 4E 47 ...可能还有49 48 44 52等等。孩子可能会问“老师这些乱七八糟的数字是什么”这时候告诉他图片也是数据。图片并不是计算机里面的一幅“画”。它实际上也是一大堆字节只不过图片软件知道这些字节按照 PNG 规则解释于是字节 ↓ PNG解析规则 ↓ 图片而文本软件则是字节 ↓ 字符编码规则 ↓ 文字所以特别重要的一句话是同样是一堆 0 和 1不同的软件按照不同规则解释就可以变成文字、图片、音乐、视频……十一、顺便认识一个非常重要的概念文件头打开很多二进制文件时你会发现文件开头的一些字节非常特殊。例如 PNG 图片开头有固定的文件标识。这就像什么同学们可以理解成文件的“身份证”。例如文件 │ ├── 文件头 │ ↓ │ “我是 PNG” │ ├── 图片数据 │ ├── 图片数据 │ └── ...很多文件格式都有自己的“身份证”。例如PNG JPG PDF ZIP EXE MP3它们内部的字节排列规则都不一样。这就给后面学习文件格式二进制文件文件读写fstreamifstreamofstreamread()write()打下了非常好的基础。十二、把这个知识和 C 联系起来这一步对于正在学 C 的小学生尤其重要。我们之前可能写过ofstream fout(data.txt); fout ABC; fout.close();这里fout ABC;最终并不是把“ABC”三个神奇的字符直接塞进硬盘。而是经过字符编码最终变成字节。例如 ASCII 情况下A → 41 B → 42 C → 43于是文件里面就有41 42 43十三、再进一步C直接读“字节”以后学习二进制文件时我们可以使用#include iostream #include fstream using namespace std; int main() { ifstream fin(hello.txt, ios::binary); char c; while (fin.get(c)) { cout (int)(unsigned char)c ; } fin.close(); return 0; }如果文件里面是ABC那么可能输出65 66 67注意这里是十进制。因为A 65 B 66 C 67换成十六进制就是41 42 43于是我们终于把C程序 ↓ 读取文件 ↓ 字节 ↓ 十进制 / 十六进制 ↓ 二进制整个过程串起来了。十四、给同学们建立一张“地图”文件 │ ↓ ┌─────────────┐ │ 一串字节 │ └─────────────┘ │ ┌──────┴──────┐ ↓ ↓ 十六进制 二进制 │ │ 41 42 43 01000001... │ ↓ 字符编码 │ ↓ ABC最重要的是理解41不是一个“字母 A”。它首先是一个数字/字节的表示。按照 ASCII 规则解释41 → A按照其他规则它可能代表完全不同的东西。十五、我们进行一个“文件侦探”实验️ 文件侦探任务任务1创建hello.txt输入ABC然后用 HxD 打开。找到41 42 43任务2把41修改成44看看文本发生什么变化。任务3找一个图片文件用 HxD 打开。观察文件开头是什么样的任务4再找一个PDF ZIP MP3文件。分别打开看看。同学们来思考为什么它们开头的数据不一样十六、最后给同学们留三个“金句”金句1文件的本质是硬盘里保存的一串字节。金句2二进制是计算机最熟悉的语言十六进制是程序员观察二进制的好工具。金句3文字、图片、音乐、视频本质上都是数据区别只是“解释这些数据的规则”不同。如果同学们把这三句话真正理解了那么对C文件操作、二进制文件、内存、指针、字符编码、文件格式的理解会一下子串起来。
返回列表