找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 641|回复: 0

第19集的文字稿

[复制链接]

432

主题

324

回帖

3658

积分

管理员

积分
3658
发表于 2024-11-23 19:27:26 | 显示全部楼层 |阅读模式
001.
我们知道,字节是计算机内存的最小和最基本的可寻址单位,内存可视为由大量的字节线性排列而成。然而,现代的计算机对内存的访问既可以按字节进行,也可以按字进行。换句话说,处理器对内存进行单次操作的数据宽度可以是字节,也可以是长度不等的字,一个字可能包含2个字节、4个字节或者8个字节,等等,具体的长度取决于处理器的字长和处理器与内存之间的总线宽度。


注意,我们说的是“单次操作”,单次操作就好比一次送20斤大米,而不是分两次送每次10斤。对于所有的计算机系统来说,对内存的字节访问都是一样的。如图(a)所示,如果先写入一个字节8C,再写入一个字节4E,且按地址递增的方向写入,则数据在内存中的布局在所有计算机上都一样,都是8C在前(低地址),4E在后(高地址)。


然而,如果是以字为单位写入,情况就不同了。假如我们要写入一个16位的十六进制数字4E8C,尽管这是一个完整的16位数字,但由于内存是按字节组织的,所以当我们写入之后再按字节的视角来看内存时,在有些计算机系统上,第一个字节是8C,第二个字节是4E,如(b)所示;在另外一些计算机系统上,第一个字节是4E,第二个字节是8C,如(c)所示。


在一个字中,比如4E8C这个字,8C是字的低字节部分,4E是字的高字节部分。在(b)中,字的低字节部分被置入内存的低地址字节单元,而高字节被置入内存的高地址字节单元,这称为是小端或者低端字节序的,简写为LE。相反地,如(c),字的低字节部分被置入内存的高地址字节单元,而高字节被置入内存的低地址字节单元,这称为是大端或者高端字节序的,简写为BE。


如果只在某个封闭的计算机系统上工作,则我们不必关心字节序的问题,因为数据是自产自销的,古人从上往下写字,但他们也是从上往下读书的;一个人写字潦草,他只要不给别人看,就不会有任何问题。低端字节序和高端字节序是一种客观存在,由计算机的体系结构所决定,说白了就是处理器和内存之间采用了不同的布线方式。如果数据的生成、加工处理和输出只在同一个计算机系统上完成,用户对此也不会有任何感知,不需要知道字节序的存在。


002.
但是,当涉及到数据传输和处理时,问题就出现了。给定一个字符,假定它的代码点是U+4E8C,那么它的UTF-16编码是4E8C。同一个字符编码,在不同的计算机系统上存储时,会有不同的字节顺序。


假定计算机A是采用低端字节序的,那么这个UTF-16编码的字节序是8C  4E;相反地,计算机B是采用高端字节序的,那么这个UTF-16编码的字节序是4E  8C。


如果计算机A要将内存里的字符编码保存到文件里,那么,内存的读取是从低地址到高地址,而且是按字节写入,所以写入文件时,先写8C,再写4E。如果计算机A要将内存里的字符编码通过网络发送给别的计算机,那么,内存的读取同样是从低地址到高地址,而且是按字节发送,所以是先发送8C,再发送4E。


同样地,如果计算机B要将内存里的字符编码保存到文件里,那么,内存的读取是从低地址到高地址,而且是按字节写入,所以写入文件时,先写4E,再写8C。如果计算机B要将内存里的字符编码通过网络发送给别的计算机,那么,内存的读取同样是从低地址到高地址,而且是按字节发送,所以是先发送4E,再发送8C。


003.
再来看,对于同一个文件,或者从网络发来的同一个文本信息,不同的计算机系统是如何处理的。


文件的内容是4E  8C,计算机C和计算机D都是逐字节读取并写入内存。先读4E,再读8C,写入时先写4E,再写8C。在这一点上,计算机C和计算机D是一样的。


如果是从网络接收的文本信息,计算机C和计算机D都是先接收到4E,后接收到8C,写入内存时,都是先写入4E,再写入8C。在这一点上,计算机C和计算机D依然是一致的。


但是,在文件读取完毕或者网络传输完毕后,由于计算机C是采用低端字节序的,它认为自己接收的文本是U+8C4E,而计算机D是采用高端字节序的,它认为自己接收的文本是U+4E8C。


显然,对于同一个字符编码,不同的计算机系统有不同的存储方式,并可能在信息传输和交换时产生不同的字节顺序,同时在接收端还原出错误的编码信息。为此,ISO/IEC 10646和Unicode不但要制定UCS的编码形式,还要制定具体的编码方案,这就是下一课的内容。




为了指导计算机系统如何将字符编码串化(分解)为字节的序列,并将字节的序列并化(合并)为16位或32位的字符编码,于是就产生了UTF-16、UTF-16LE、UTF-16BE、UTF-32、UTF-32LE和UTF-32BE编码方案。这些方案指定了字符的编码按什么顺序分解为字节,也指定了应该如何将字节组装为正确的字符编码。例如,要是一个字符的编码是0430,而且是按UTF-16LE编码的,就意味着它应当串化为30 04(而不是04 30);而在另一个程序或者另一台计算机上,它应当将这两个字节合并为0430(而不是3004)。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2025-6-8 07:30 , Processed in 0.207964 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表