endian的起源:Lilliput和Blefuscu这两大强国持续打了36个月的苦战,战争开始是由于以下的原因:我们大家都认为吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋按照这种方法吃的时候却把手指弄破了,因此当今皇帝的曾祖父就下令,命令全体臣民吃鸡蛋时必须先打破较小的一端,违令者重罚,而后老百姓们对这个命令极其反感。历史告诉我们,这个命令导致了六次叛乱,其中一个皇帝送了命,一个丢了王位。这些叛乱大多是有Blefuscu的国王大臣们煽动起来的,叛乱过后,流亡的人总是逃到Blefuscu帝国去避难,据估计,先后有1.1万人情愿受死也不肯去打破鸡蛋较小的一端,关于这一争端曾出版过几百本著作,不过关于大端派的书一直都是受禁的,法律也规定该派的任何人不得做官。
In computing, endianness is the byte (and sometimes bit) ordering used to represent some kind of data. Typical cases are the order in which integer values are stored as bytes in computer memory (relative to a given memory addressing scheme) and the transmission order over a network or other medium. When specifically talking about bytes, endianness is also referred to simply as byte order. [1]Generally speaking, endianness is a particular attribute of a representation format—which byte of a UCS-2 character would be stored at the lower address, etc. Byte order is an important consideration in network programming, since two computers with different byte orders may be communicating. Failure to account for varying endianness when writing code for mixed platforms can lead to bugs that can be difficult to detect.
------------------------------
中文维基词条endian
字节序,又称端序,尾序,英文:Endianness。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。一般而言,字节序指示了一个UCS-2字符的哪个字节存储在低地址。如果LSByte在MSByte的前面,即LSB为低地址,则该字节序是小端序;反之则是大端序。在网络编程中,字节序是一个必须被考虑的因素,因为不同的处理器体系可能采用不同的字节序。在多平台的代码编程中,字节序可能会导致难以察觉的bug。
Dim aa() As Byte
Dim bb() As Byte
Dim i As Long
Dim strUMem As String, strAMem As String
Dim strU As String, strA As String aa = str1
bb = StrConv(str1, vbFromUnicode)
'我有点Slow的编码
'Unicode : 11-62-09-67-B9-70-53-00-6C-00-6F-00-77-00
'Ansi : CE-D2-D3-D0-B5-E3-53-6C-6F-77
For i = 0 To UBound(aa)
strUMem = strUMem & Right$("0" & Hex$(aa(i)), 2) & "-"
Next i
strUMem = Left(strUMem, Len(strUMem) - 1)
Debug.Print strUMem
For i = 1 To Len(str1)
strU = strU & Hex(AscW(Mid(str1, i))) & "-"
Next i
strU = Left(strU, Len(strU) - 1)
Debug.Print strU
For i = 0 To UBound(bb)
strAMem = strAMem & Right$("0" & Hex$(bb(i)), 2) & "-"
Next i
strAMem = Left(strAMem, Len(strAMem) - 1)
Debug.Print strAMem
For i = 1 To Len(str1)
strA = strA & Hex(Asc(Mid(str1, i))) & "-"
Next i
strA = Left(strA, Len(strA) - 1)
Debug.Print strA
Debug.Print ChrW(&H6211) & ChrW(&H6709) & ChrW(&H70B9) & ChrW(&H53) & ChrW(&H6C) & ChrW(&H6F) & ChrW(&H77)
Debug.Print Chr(&HCED2) & Chr(&HD3D0) & Chr(&HB5E3) & ChrW(&H53) & ChrW(&H6C) & ChrW(&H6F) & ChrW(&H77)
End Sub
立即窗口中的结果:GetUACode("我有点Slow")
11-62-09-67-B9-70-53-00-6C-00-6F-00-77-00
6211-6709-70B9-53-6C-6F-77
CE-D2-D3-D0-B5-E3-53-6C-6F-77
CED2-D3D0-B5E3-53-6C-6F-77
我有点Slow
我有点Slow
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
Unicode big endian:在Big-endian处理器(如苹果Macintosh电脑)上建立的Unicode文件中的文字位元组(存放单位)排列顺序,与在Intel处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组(MSB)拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择Unicode big-endian格式。
转自:http://hi.baidu.com/ensteinniesen/blog/item/6e277fafa4f85ccb7cd92a5b.html
ANSI编码是“CED2”,在内存里存储的方式(从低地址到高地址)是:CED2。MSB在低地址,是小端序。我这样理解对么?好像有点晕,这样理解的话,怎么好像Long也是大端序的啊?'测试Long在内存的存储顺序和拷贝顺序
Sub test11()
Dim Long1 As Long
Dim Long2 As Long
Dim i As Long
Long1 = &H1020304
Debug.Print Hex(Long1)
For i = 1 To 4
CopyMemory Long2, Long1, i
Debug.Print Hex(Long2)
Next i
End Sub
测试结果:1020304
4
304
20304
1020304这岂不是说明,Long的MSB(01)是存在高地址,那不是大端序么?可是12楼不是说Intel架构都是小端序,苹果架构才是大端序么?
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal byteLen As Long)
另外,是不是我对MSB的理解有误?对于整数5678来说,5就是MSB,对吧?
小端序指的是:MSB的地址最高,就是从最小的一端开始存储(从低地址存起),MSB在高地址。所以,
13楼的Long是小端序: 整数&H1020304在内存里的存储方式是040302018楼的Unicode是小端序:编码6211在内存里的存储方式是1162
8楼的ANSI却是大端序: 编码CED2在内存里的存储方式是CED2问题是:ANSI为啥是大端序呢?不是Intel架构的都是小端序么?