endian的起源:Lilliput和Blefuscu这两大强国持续打了36个月的苦战,战争开始是由于以下的原因:我们大家都认为吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋按照这种方法吃的时候却把手指弄破了,因此当今皇帝的曾祖父就下令,命令全体臣民吃鸡蛋时必须先打破较小的一端,违令者重罚,而后老百姓们对这个命令极其反感。历史告诉我们,这个命令导致了六次叛乱,其中一个皇帝送了命,一个丢了王位。这些叛乱大多是有Blefuscu的国王大臣们煽动起来的,叛乱过后,流亡的人总是逃到Blefuscu帝国去避难,据估计,先后有1.1万人情愿受死也不肯去打破鸡蛋较小的一端,关于这一争端曾出版过几百本著作,不过关于大端派的书一直都是受禁的,法律也规定该派的任何人不得做官。

解决方案 »

  1.   

    endian 字节序英文维基词条endian
    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。
      

  2.   

    上午刚BS了你,下午貌似就用到了BS过的知识Public Sub GetUACode(str1 As String)
        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
      

  3.   

    看来Unicode是小端序,ANSI是大端序。
      

  4.   

    VB6中的Long也是小端序,对吧?
      

  5.   

    big endian和little endian
    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
      

  6.   

    这样看来,Intel架构上的都是小尾。看8楼的例子中,汉字“我”Unicode编码是“6211”,但是在内存里存储的方式(从低地址到高地址)是:1162。MSB在高地址,是大端序。
    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架构都是小端序,苹果架构才是大端序么?
      

  7.   

    补充,13楼CopyMemory的声明如下:
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (pDest As Any, pSource As Any, ByVal byteLen As Long)
    另外,是不是我对MSB的理解有误?对于整数5678来说,5就是MSB,对吧?
      

  8.   

    哈哈,我还真是弄反了。应该翻译成大端就不容易弄反了。大端序指的是:MSB的地址最低,就是从最大的一端开始存储(从低地址存起),MSB在低地址。
    小端序指的是:MSB的地址最高,就是从最小的一端开始存储(从低地址存起),MSB在高地址。所以,
    13楼的Long是小端序:  整数&H1020304在内存里的存储方式是040302018楼的Unicode是小端序:编码6211在内存里的存储方式是1162
    8楼的ANSI却是大端序: 编码CED2在内存里的存储方式是CED2问题是:ANSI为啥是大端序呢?不是Intel架构的都是小端序么?
      

  9.   

    几乎在所有的机器上,多字节对象被存储为连续的字节序列,对象地址则是所使用的这些地址的最小地址。比如一个int型的变量i的地址是0x112,那么x所占的字节可能是0x100、0x101、0x102、0x103。大端法的英文名称big endian,小端法的英文名称为little endian。小端法的存储规则是从最低有效字节到最高有效字节的顺序存储对象,如上面的变量i的位表示法为0x1234567,则0x100存储01,0x101存储23,0x102存储45,0x103存储67。大端法存储的规则是从最高有效字节到最低有效字节的顺序存储对象,我们还拿i来举例,那么0x100存储67,0x101存储45,0x102存储23,0x103存储01。
      

  10.   

    16楼的问题:ANSI为啥是大端序呢?而不是Intel架构的都是小端序么?可能是因为多字符集编码的特殊规定导致的,而不是真正的大端序。看下面这段引文:后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII 127,他们使用大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与Leading Byte一起作为实际的编码。这样的字符集有很多,我们常见的GB-2312就是其中之一。例如在GB-2312字符集中,“连通”的编码为C1 AC CD A8,其中C1和CD就是Leading Byte。前127个编码为标准ASCII保留,例如“0”的编码是30H(30H表示十六进制的30)。软件在读取时,如果看到30H,知道它小于128就是标准ASCII,表示“0”,看到C1大于128就知道它后面有一个另外的编码,因此C1 AC一同构成一个整个的编码,在GB-2312字符集中表示“连”。也就是说对于汉字的ANSI编码而言,无所谓MSB, LSB。它就是把第一个字节理解为Leading Byte,第二个字节理解为另外的编码,所以它们在内存里的存放次序不能倒过来,否则就理解不对了。