得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

网络的鸡蛋

《格列夫游记》 第一卷第4章 蒋剑锋(译)

我下面要告诉你的是,Lilliput 和 Blefuscu 这两大强国在过去 36 个月里一直在苦战。战争开始是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了。因此他的父亲,当时的皇帝,就下了一道敕令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一端,违令者重罚。老百姓们对这项命令极其反感。历史告诉我们,由此曾经发生过 6 次叛乱,其中一个皇帝送了命,另一个丢了王位。这些叛乱大多都是由 Blefuscu 的国王大臣们煽动起来的。叛乱平息后,流亡的人总是逃到那个帝国去寻求避难。据估计,先后几次有 11000 人情愿受死也不肯去打破鸡蛋较小的一端。关于这一争端,曾出版过几百本大部著作,不过大端派的书一直是受禁的,法律也规定该派任何人不得做官。

主机字节序

字节(Byte)作为计算机存储的计量单位,存一个数字,可能要好几个字节,常见的如 c 的 int 类型,需要 4 个字节,字节多了,就不得不排排坐了,于是排排坐的顺序(字节序)就成了问题

假设现在有一个数字,0x10203040,假设内存地址是从左往右变大,那么把它存储下来就有两种方式:

  1. 0x10 0x20 0x30 0x40,顺着内存地址增长方向依次放置,内存地址越大,放置的数字越低位

    大端序(Big Endian):高位字节存放到低位地址(高位字节在前)

    大端序看起来和书写方向是一致的

  2. 0x40 0x30 0x20 0x10,跟内存地址增长的方向对着干,内存地址越大,放置的数字越高位

    小端序(Little Endian):高位字节存放到高位地址(低位字节在前)

这儿说的还是在计算机自己,是个体,可以有个性,所以也叫主机字节序

但是大小端总不是那么好记忆,所以又有一种说法叫高尾端和低尾端,怎么理解呢?还是拿 0x10203040 举例,显然,它的尾巴是 40,高尾端就是把尾巴放在内存的高地址,低尾端是把尾巴放在内存的低地址

网络字节序

可是,社会是群体性的,当计算机插上网线,打开网络世界以后,就不能只说 “方言” 了,集体利益高于个体利益的时候就到来了,于是 TCP/IP 协议就在 RFC1700 中规定网络字节序使用 “大端” 字节序,从此计算机之间沟通有了 “普通话”

  1. 字节内的比特位不受这种影响,大于 1 个字节的数据类型才有字节序问题

    比如一个字节 1000 0000(或表示为十六进制 80H),不管是什么顺序其内存中的表示都是这样,再比如 char a = ‘A’,a 只有一个字节的长度,a 也没有字节序的问题

  2. 大于 1 个字节的数据类型的字节顺序

    网络字节序是 “所见即所得” 的顺序,是高尾端,而低尾端的字节顺序正好与此相反

    比如 short B = 0102H(十六进制,每两位表示一个字节的宽度),所见到的是 0102 ,假设内存地址从左到右增加,在内存中这个 short B 的字节顺序是 01 02,可以通过抓包验证网络数据中 B 的字节流为 01 02

    如果这表示两个单字节类型的变量,那么不需要考虑字节顺序的问题,如果这表示一个多个字节的变量,就需要考虑字节顺序问题

be yourself, everyone else is already taken.