罗伯特·吴
宣布于 中国新闻网
+关注
Endian在名称中的寄义,通常不是某个通俗英语单词的自力词义,而是盘算机领域中对“数据排列偏向”的称呼。它最常泛起在 big-endian、little-endian 和 endianness 等术语里,用来说明一个多字节数值在内存、文件或通讯数据中的存放顺序。简朴说,看到这个词时,首先应遐想到“高位和低位谁先泛起”,而不是把它明确成某种字符编码或数据类型。
这个名称为什么会和“大端、小端”有关
这个术语的泉源通常追溯到英国作家乔纳森·斯威夫特的《格列佛游记》。书中有一场关于鸡蛋应该从大头照旧小头敲开的争论:从大头敲的人被称为 Big-Endian,从小头敲的人被称为 Little-Endian。厥后,盘算机行业借用了这组说法,用来形貌统一个数值的差别排列方法。
因此,big 和 little 体现的是“哪一端先安排”,并不是说数据自己更大或更小。Endian 可以明确为一个与“端序、排列偏向”有关的术语因素。中文里常译为“大端”和“小端”,而形貌这种差别的属性则常译为“字节序”或“端序”。
Big-endian和little-endian详细差在那里
假设有一个四字节整数 0x12345678。凭证从高位到低位拆分,它由 12、34、56、78 四个字节组成。区别在于,这四个字节写入一连内存或数据流时,谁位于前面。
统一个数值在两种字节序下的排列
| 排列方法 |
从低地点或数据开头看到的顺序 |
先安排的部分 |
| Big-endian |
12 34 56 78 |
高位字节 |
| Little-endian |
78 56 34 12 |
低位字节 |
这里转变的是字节排列,不是数学数值自己。只要程序凭证相同规则读取,两个系统都能获得 0x12345678。真正爆发问题的情形,通常是写入方使用一种顺序,读取方却误用了另一种顺序。此时原本正常的数值可能会酿成很大的整数、异常的长度、过失的时间戳,甚至导致文件剖析失败。
名称中泛起这个词时,通常在说明什么
差别手艺语境中的寄义大致如下:
- big-endian:高位字节排在前面。它更靠近人们誊写多位数字时从高位到低位的直观顺序。
- little-endian:低位字节排在前面。许多处置惩罚器和操作系统情形会接纳这种方法,但不可仅凭装备名称武断判断。
- endianness:体现数据排列所接纳的端序属性,也就是“这个系统或名堂使用哪一种字节顺序”。
- host endian:体现目今主机或运行情形接纳的本机字节序。它可能与另一台装备差别。
- network byte order:网络协议中的约定俗成的字节顺序,许多互联网协议字段接纳大端顺序,但详细名堂仍应以协议说明为准。
- bi-endian:体现某个处置惩罚器、系统或程序能够支持两种端序,现实使用哪一种要看设置和运行模式。
若是它泛起在变量名、函数名或设置项中,例如某个名称带有 Endian 后缀,通常是在提醒使用者:这里的数值转换、二进制读写或协议封装需要明确字节序。它并不自动说明数据一定是大端,也不代表名称中的其他字符具有特殊编码寄义。
字节序和字符顺序不是一回事
这是明确相关名称时最容易混淆的地方。字节序主要针对一个由多个字节组成的数值或字段,例如整数、浮点数、长度值和时间值。它并不料味着通俗文本要从右向左阅读,也不料味着一串英文字母会自动倒过来。
例如,ASCII 字符通常一个字符对应一个字节,单字节字符不保存高位字节和低位字节的排列问题。关于 UTF-8,也不可简朴地用“大端”或“小端”诠释整段文本。UTF-16、UTF-32 这类以多个字节体现字符的编码,才可能涉及字节序;其中有些文件会通过字节顺序标记,也就是 BOM,资助读取方判断排列方法。
以是,当一个文件中的中文或英文显示乱码时,不可只看到名称里含有某个端序术语,就认定问题一定来自字节序;褂觳樽址嗦搿⒔饴敕椒ā⑽募名堂和字段界线。整数读取过失与文本解码过失,处置惩罚思绪并不相同。
遇到不熟悉的名称,怎样判断它的真实寄义
若是是在代码、接口文档、二进制文件或装备协议中看到相关名称,可以按下面的顺序判断:
- 先看它修饰的工具。若是工具是整数、字节数组、内存结构、序列化名堂或网络字段,端序寄义的可能性很高;若是它只是文件名、用户名或项目代号,则不可仅凭拼写推断手艺寄义。
- 确认单位是字节照旧位。Big-endian 和 little-endian通常说的是字节序。一个协议纵然划定了字节顺序,也可能另外划定每个字节内部的位顺序,两者不可混为一谈。
- 审查字段宽度。单字节字段没有字节交流问题;两字节、四字节或八字节整数才需要重点确认排列规则。结构体中差别字段也可能有各自的编码划定。
- 寻找明确的名堂标识。协议说明、文件头、版本字段、BOM、魔数或测试样例,往往比名称自己更可靠。有些名堂牢靠接纳一种端序,有些名堂会在文件头中标出目今顺序。
- 用已知数值做验证。可以写入一个容易识别的数值,例如四个字节划分差别的测试值,再视察原始字节约的排列。若读出的效果与预期相反,通常说明端序设置纷歧致,也可能是字段偏移或长度判断过失。
为什么统一串十六进制数据会被诠释成差别效果
假设原始数据依次为 01 00 00 00。若是凭证小端方法读取四字节整数,它通常体现数值 1;若是凭证大端方法读取,则会被诠释成 16777216。原始字节没有转变,转变的是读取规则。
这类征象在跨平台传输、生涯二进制文件、挪用硬件接口和举行网络协议剖析时尤其常见。常见体现包括:长度字段异常、数组数目过大、时间值落在不对理规模、颜色或坐标泛起显着过失,以及文件头看起来完全不匹配。排查时应先确认读取位置和字段宽度,再确认字节序,不可只通过“数值看起来差池”直接下结论。
明确这个名称时应阻止的几个误区
- 它不是体现“英文单词的巨细写偏向”,也不是“文本从左到右或从右到左”的名称。
- 大端不代表性能一定更好,小端也不代表数据一定更节约空间。两者主要是体现和处置惩罚约定。
- 处置惩罚器架构、操作系统、编程语言和文件名堂的端序并不必定完全相同,必需以详细接口的划定为准。
- 看到 Endian 这个词,只能判断它可能与数据排列有关;要确定是大端、小端,仍需连系完整名称、上下文和名堂文档。
总的来说,这个名称借用了“从哪一端最先”的比喻,在盘算机领域专门指向多字节数据的排列偏向。明确了它与高位字节、低位字节、内存地点和数据流顺序之间的关系,就能较准确地判断相关名称是在形貌端序、转换操作,照旧仅仅作为一个项目或工具的自界说标识。
vudnjwpugeiopoai7b05jsf9lg5bymj