将数据从字节切片解码到Uint32

Pol*_*ang 4 go

package main

import (
        "bytes"
        "encoding/binary"
        "fmt"
)

func main() {
        aa := uint(0xFFFFFFFF)
        fmt.Println(aa)
        byteNewbuf := []byte{0xFF, 0xFF, 0xFF, 0xFF}
        buf := bytes.NewBuffer(byteNewbuf)
        tt, _ := binary.ReadUvarint(buf)
        fmt.Println(tt)
}
Run Code Online (Sandbox Code Playgroud)

需要将4字节数组转换为uint32,但为什么结果不一样?go verion:beta 1.1

Jam*_*dge 7

您可以使用包中的一个ByteOrder对象执行此操作encoding/binary.例如:

package main

import (
        "encoding/binary"
        "fmt"
)

func main() {
        aa := uint(0x7FFFFFFF)
        fmt.Println(aa)
        slice := []byte{0xFF, 0xFF, 0xFF, 0x7F}
        tt := binary.LittleEndian.Uint32(slice)
        fmt.Println(tt)
}
Run Code Online (Sandbox Code Playgroud)

如果您的数据采用大端格式,则可以使用相同的方法binary.BigEndian.


zzz*_*zzz 5

tt := uint32(buf[0])<<24 | uint32(buf[1])<<16 | uint32(buf[2]) <<8 |
        uint32(buf[3])
Run Code Online (Sandbox Code Playgroud)

对于BE或

tt := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2]) <<16 |
        uint32(buf[3]) <<24
Run Code Online (Sandbox Code Playgroud)

为了LE.

[u] varint是一种不同类型的编码(32位数字在编码形式中可以有多达5个字节,64位数字最多可以有10个字节).

  • 无需为[]字节创建缓冲区.而是直接在字节切片上使用Varint或Uvarint.

  • 你丢弃了函数返回的错误.第二个结果表明读取了多少字节或是否存在问题.存在一个问题,而解码0xff的,0xff的,0xff的,0xff的作为uvarint.