- 示例工程
- 教程
【免费下载链接】仓颉编程基础及应用_陈波_何睿_重庆大学
《仓颉编程基础及应用》,清华大学出版社,2025年9月第1版: 1. 随书源代码; 2. PPT; 3.在线扩展阅读资料。
本文围绕《仓颉编程基础及应用》配套文档"使用format-hex以16进制格式查看文件内容"展开,完整复现在 Windows PowerShell 下进入命令行、定位到随书第 12 章源文件目录、并以 16 进制格式查看article.txt内容的三步操作流程。结合仓库中 BookSourceCode/CH12 目录下的真实源文件与仓颉(Cangjie)示例代码,本文进一步解释Format-Hex输出中"偏移量列、十六进制字节列、ASCII 文本列"三列各自的含义,以及为什么 ASCII 文本文件能被第 3 列正确"翻译"而二进制文件不能,帮助读者建立起"程序眼中的文件"与"屏幕上的字节"之间的对应关系。
一、为什么用 Format-Hex:从"读文件"到"看字节"
第 12 章的主题是文本文件与二进制文件的读写。在仓颉代码里,File流读取到的是Array<Byte>,只有在调用String.fromUtf8之类的转换之后,这些字节才会变成人类可读的文本。也就是说,任何文件在磁盘上的本质都是字节序列,Format-Hex提供的正是绕过一切解析、直接观察原始字节的窗口。
本文的实操环境是一个 Windows 系统:
- 需要查看的文件是
article.txt,它是一个按 ASCII 编码的英文文本文件,位于D:\CJLearn\CH12目录下; - 从仓库结构看,
D:\CJLearn\CH12正是本书第 12 章随书源码在 Windows 机器上的部署目录,对应仓库中的 BookSourceCode/CH12 目录。仓库中 PathDemo 示例 就直接把D:/CJLearn/CH12/article.txt作为绝对路径示例来使用,ERG 示例 也读取D:/CJLearn/CH12/ergcurve.dat,二者与本文操作的路径完全一致。
仓库中 article.txt 的内容起始于:
In the summer of 1922, Nick Carraway moves from Minnesota to work as a bond salesman in New York. ...这是一个纯 ASCII 文本文件,因此用它来做Format-Hex演示非常合适:输出的第 3 列能够把每个字节还原为可读的英文字符,读者可以直观验证"十六进制字节 ↔ 文本"的映射关系。
二、进入 PowerShell
在 Windows 操作系统下,按下 Windows 徽标键(或按Win键打开开始菜单),输入PowerShell,然后用鼠标点击"最佳匹配"下的Windows PowerShell。
打开后的 Windows PowerShell 界面如下图所示(本例中当前路径为C:\Users\Alex,读者的计算机上当前路径可能不同):
说明:
Format-Hex是 PowerShell 内置的格式化 cmdlet,随 Windows PowerShell 5.0 及以后的版本提供,无需额外安装。
三、定位到文件所在目录
由于作者需要查看的文件位于D:\CJLearn\CH12目录下,因此先执行下述命令将当前路径定位过去。在读者的计算机上,相关路径很可能不一样,请根据需要灵活变通。
作者依次录入并执行了下述命令(输入完每条命令后按下Enter键):
| 序号 | 命令 | 用途 |
|---|---|---|
| 1 | d: | 将当前盘符从 C 盘切换至 D 盘。如果读者要查看的文件位于 C 盘,则不需要执行该命令。 |
| 2 | cd CJLearn | 将当前目录切换至 D 盘根目录下的CJLearn子目录。cd意为changedirectory(改变目录)。 |
| 3 | cd CH12 | 进一步切换至当前路径下的CH12子目录(截图所示)。 |
| 4 | dir | 显示当前路径下全部文件的列表。 |
执行dir后可以看到,article.txt位于D:\CJLearn\CH12目录下,其长度为4022 字节,与仓库中 BookSourceCode/CH12 目录下的同名文件内容一致。dir的输出包含Mode(属性)、LastWriteTime(最后修改时间)、Length(长度,单位字节)、Name(文件名)四列,其中d----表示目录,-a---表示普通文件。
一个小观察:仓库中的 article.txt 为 3971 字节,而 Windows 下测得 4022 字节,两者相差恰好 51 字节。从文件行数看(51 行)可以推断,Windows 侧副本的每行行尾是 CRLF(
0D 0A,2 字节),而仓库中的副本行尾是 LF(0A,1 字节),51 行 × 1 字节 = 51 字节,与差值吻合。这也提醒读者:同一个文本文件在不同平台上的字节数可能因换行符表示方式不同而略有差异。
四、使用 Format-Hex 查看文件内容
在D:\CJLearn\CH12目录下执行命令:
format-hex article.txt其中,article.txt可以替换成其它文件名。
Format-Hex的输出大体上分为三列:
| 列 | 内容 | 说明 | | -- | ---- | ---- | | 第 1 列 | 偏移量(地址) | 该行内容在文件中的起始位置,单位为字节,以 16 进制表示,如00000000、00000010(即十进制 16)。 | | 第 2 列 | 16 进制字节值 | 以 16 个字节为一行,逐字节显示其 16 进制值。输出顶部的00 01 02 ... 0F是该行内 16 个字节的列标(行内偏移)。 | | 第 3 列 | ASCII 文本 | 将每个字节按 ASCII 码解释为字符后得到的文本;不可打印的字节以.占位。 |
以截图中第一行数据为例逐字节解读:
00000000 49 6E 20 74 68 65 20 73 75 6D 6D 65 72 20 6F 66 In the summer of- 第 1 列
00000000表示该行从文件开头(第 0 字节)开始; - 第 2 列
49 6E 20 74 68 65 ...是 16 个字节的 16 进制值,其中49对应 ASCII 码 73(I),6E对应 110(n),20对应 32(空格); - 第 3 列
In the summer of正是这些字节按 ASCII 码翻译出来的文本,与 article.txt 的开头In the summer of 1922, Nick Carraway...完全吻合。
继续观察后续行可以看到几个有代表性的字节:
- 行尾处的
0A就是换行符 LF(十进制 10),第 3 列中以.占位; 31 39 32 32 2C对应文本1922,,说明数字和标点同样以 ASCII 码存储;- 第二行
20 31 39 32 32 2C 20 4E 69 63 20翻译出来即1922, Nic,与文件第二行Nick rents a house...的衔接一致。
本例中,由于article.txt是按照 ASCII 码进行编码的文本文件,因此format-hex输出内容的第 3 列正确"解释"了文件内容。这正是选择 ASCII 文本文件做演示的原因:它让"十六进制字节 → 字符"的映射一目了然。
五、结合仓库源码理解"字节视图"
Format-Hex在屏幕上展示的,恰是仓颉程序读写文件时"先拿到字节、再解释含义"这一过程中最原始的那一步。对照仓库中第 12 章的几个示例,可以把三列输出放到代码语境中理解。
1. 文本读取:字节数组到字符串
TextRead 示例 的核心逻辑是:
let fi = FileInfo("textfile.txt") let data = Array<Byte>(fi.size, repeat: 0) // 按文件尺寸开辟字节缓冲区 let sizeReaded = f.read(data) // 从文件中读出原始字节 let s = String.fromUtf8(data) // 字节序列 → 字符串 print("读到${sizeReaded}字节的内容:\n${s}")f.read(data)得到的data就相当于Format-Hex第 2 列展示的那串 16 进制字节,String.fromUtf8(data)做的事情则相当于第 3 列的"翻译"。对 ASCII 文件而言,fromUtf8与按 ASCII 解释结果一致,所以屏幕上是正常文本;这也解释了为什么文档中说第 3 列能正确"解释"article.txt的内容。
2. 二进制文件:第 3 列会"看不懂"
同样是第 12 章,PiWrite 示例 把Float32类型的圆周率以小端序写入 4 个字节,PiRead 示例 再用Float32.readLittleEndian还原:
let t = Array<Byte>(4, repeat: 0) let size = pi.writeLittleEndian(t) // 4 字节 f.write(t) // 二进制写入ERG 示例 则读取 ergcurve.dat 这个 1600 字节的文件,每 4 字节解释为一个Float32小端样本,共 400 个样本,再写入 CSV。这类二进制文件如果也用format-hex查看,第 1、2 列仍然精确,但第 3 列的 ASCII 翻译大多是.占位或看似乱码的字符——因为它不是文本,强行按字符解释自然"解释不通"。两个方向的对照恰好印证了文档的结论:第 3 列是否可读,取决于文件本身的编码性质,而第 2 列的 16 进制值在任何情况下都是文件的真实内容。
3. 定位文件:与 Format-Hex 的前置步骤呼应
PathDemo 示例 使用Path类型区分绝对路径D:/CJLearn/CH12/article.txt与相对路径../article.txt,这与本文第三、四步中"先cd到目录、再对文件名执行format-hex"的操作逻辑是同一件事的不同层面:命令行里的"当前目录 + 文件名",对应程序里相对路径解析所依赖的工作目录(env.getWorkingDirectory())。
六、小结与延伸
Format-Hex是 PowerShell 观察文件原始字节最直观的手段,输出固定为三列:字节偏移量、16 字节一行的 16 进制值、ASCII 文本;- 查看前先切换到文件所在盘符与目录(
d:、cd ...),用dir确认文件存在与字节数,再执行format-hex <文件名>; - 对 ASCII 文本文件(如本章的
article.txt),第 3 列可直接读出文件内容;对pi.dat、ergcurve.dat这类二进制文件,只有第 2 列的 16 进制值具有直接意义,需要结合数据类型(如Float32小端序)自行"解码"; - 延伸用法:
Format-Hex同时也是一个通用格式化 cmdlet,可以接收来自管道或Get-Content -AsByteStream的字节流进行格式化显示(具体可用性取决于本机 PowerShell 版本),便于只查看文件开头若干字节而不必滚完整个文件。
通过这一实操,读者获得的不仅是一条命令的用法,更是"文件 = 字节序列"这一底层视角——这正是第 12 章文本与二进制文件读写全部内容的基石。
- 示例工程
- 教程
【免费下载链接】仓颉编程基础及应用_陈波_何睿_重庆大学
《仓颉编程基础及应用》,清华大学出版社,2025年9月第1版: 1. 随书源代码; 2. PPT; 3.在线扩展阅读资料。
相关推荐
《仓颉编程基础及应用》扩展阅读:用 std.convert 的 format 函数掌握仓颉字符串的复杂格式化
《仓颉编程基础及应用》扩展阅读:用 std.convert 的 format 函数掌握仓颉字符串的复杂格式化 将一个数值对象转换成指定样式的字符串(规定宽度、对
示例工程教程仓颉位运算详解:从二进制/十六进制转换到置位与复位实战——《仓颉编程基础及应用》配套教程
仓颉位运算详解:从二进制/十六进制转换到置位与复位实战——《仓颉编程基础及应用》配套教程 计算机内的数据存储与操作永远是二进制的。本篇基于《仓颉编程基础及应用》
示例工程教程大麦自动抢票脚本:把选座下单交给配置驱动
大麦自动抢票脚本:把选座下单交给配置驱动 开票瞬间手动点击往往慢半拍,页面先弹出缺货登记,票就没了。ticket purchase 把选城市、挑票价、勾观演人、
GUI 自动化RPA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考