博文

目前显示的是标签为“字节序”的博文

由大小端字节序引发的“血案”

图片
之所以用“血案”是因为在了解Go package  encoding/binary 的时候,突然就触及到了一个明明很基础但是就是想起不来的知识点。 字节序 “血案”由字节序引发。那就先聊一下字节序。字节序分大端( bigEndian )、小端( littleEndian )。关于大端小端概念的起源,还有一个有意思的故事: 我下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去36个月里一直在苦战。战争开始是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了。因此他的父亲,当时的皇帝,就下了一道敕令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一端,违令者重罚。老百姓们对这项命令极其反感。历史告诉我们,由此曾经发生过6次叛乱,其中一个皇帝送了命,另一个丢了王位。这些叛乱大多都是由Blefuscu的国王大臣们煽动起来的。叛乱平息后,流亡的人总是逃到那个帝国去寻求避难。据估计,先后几次有11000人情愿受死也不肯去打破鸡蛋较小的一端。关于这一争端,曾出版过几百本大部著作,不过大端派的书一直是受禁的,法律也规定该派任何人不得做官。” 故事之外,现在我们普遍认为的大端小端定义如下: 大端:随着内存地址的增加,由高位到低位存储数据。网络字节序一般为大端序。 小端:随着内存地址的增加,由低位到高位存储数据。x86 cpu内部字节序一般为小端序。 举个例子:有一个数 0x14 25 0A 0B ,其中 0x14 是其最高位, 0x0B 是其最低位。那么: Go encoding/binary Package binary implements simple translation between numbers and byte sequences and encoding and decoding of varints. 在这个包中,有一个 Read 函数: func Read ( r io . Reader , order ByteOrder , data interface { } ) error 官方例子: package main import ( "bytes" ...