代码之家  ›  专栏  ›  技术社区  ›  smokums

小端点编码Go lang

  •  4
  • smokums  · 技术社区  · 7 年前

    我必须在网络服务器上工作,我们的首席工程师编写的代码中有一些部分我不理解,目前正在尝试破译。这是一个类似的、更简单的版本,它描述了我们的代码库中正在发生的事情,我想知道是否有人可以一步一步地给我一个深入的解释。

    package main
    import "fmt"
    import "encoding/binary"
    func main() {
    ////////////////////////////////// no need to explain anything
        b := []byte{2,3,5,7,11,13} /// within this comment block.
        for _,e := range b {        //
        fmt.Printf("%d ",e)         //
        }                           //
        fmt.Printf("\n")            //
        //////////////////////////////
        length:= binary.LittleEndian.Uint32(b)  /// <<< Why this results in                                                 
                                                /// 117768962 is the question.
        fmt.Printf("customLen=%d\n",int(length))
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  21
  •   dtolnay    7 年前

    当我们用英语写数字时,我们用大端十进制表示。例如,数字“4567”被理解为 4*10^3 + 5*10^2 + 6*10^1 + 7*10^0 。这是 底座-10 因为每个书写数字的重要性与相邻数字相差10倍 大端元 因为第一个写入的数字与10的最大幂相关。

    同样的数字4567可以写成“7654”,以小端数字为基数-10,用小端数字表示意味着 7*10^0 + 6*10^1 + 5*10^2 + 4*10^3 ,数字与上一段相同。这是 小恩迪亚 因为第一个写入的数字与最小的10次方相关联。

    这个 binary.LittleEndian.Uint32 函数接收字节片并从中读取一个32位无符号整数,表示为 little endian base-256 .

    所以如果输入片中的基256位数 b 2,3,5,7 正如它们在代码中一样,这些字节的小endian base-256解释是 2*256^0 + 3*256^1 + 5*256^2 + 7*256^3 。相同的数字写在big endian base-10中(这是 fmt.Printf 将显示)是“117768962”。