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

时间:2013-04-06 08:49:13

标签: 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)
}

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

4 个答案:

答案 0 :(得分:6)

您可以使用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)
}

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

答案 1 :(得分:4)

tt := uint32(buf[0])<<24 | uint32(buf[1])<<16 | uint32(buf[2]) <<8 |
        uint32(buf[3])

表示BE或

tt := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2]) <<16 |
        uint32(buf[3]) <<24

表示LE。

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

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

  • 您丢弃了函数返回的错误。第二个结果表明读取了多少字节或是否存在问题。解密0xff,0xff,0xff,0xff为uvarint时出现 问题。

答案 2 :(得分:2)

以下是如何使用encoding/binary包来执行您想要的操作。请注意,您不希望使用任何var函数作为可变长度编码。

Playground version

package main

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

func main() {
    aa := uint(0xFFFFFF0F)
    fmt.Println(aa)
    tt := uint32(0)

    byteNewbuf := []byte{0x0F, 0xFF, 0xFF, 0xFF}
    buf := bytes.NewBuffer(byteNewbuf)
    err := binary.Read(buf, binary.LittleEndian, &tt)
    if err != nil {
        log.Fatalf("Decode failed: %s", err)
    }
    fmt.Println(tt)
}

结果是

4294967055
4294967055

答案 3 :(得分:-1)

  

Numeric types

byte        alias for uint8

由于byteuint8的别名,因此您的问题“需要将4个字节的数组转换为uint32”已经得到了解答:

How to convert [4]uint8 into uint32 in Go?

  

Package binary

     

[Uvarints和] Varints是一种使用one编码整数的方法   或更多字节;绝对值越小的数字越小   字节数。有关规范,请参阅   http://code.google.com/apis/protocolbuffers/docs/encoding.html

由于Uvarint是一种特殊形式的整数表示和存储,因此您只应对使用ReadUvarint函数编写的值使用Uvarint函数。

例如,

package main

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

func main() {
    buf := make([]byte, 10)
    x := uint64(0xFFFFFFFF)
    fmt.Printf("%2d %2d %v\n", x, len(buf), buf)
    n := binary.PutUvarint(buf, x)
    buf = buf[:n]
    fmt.Printf("%2d %2d %v\n", x, len(buf), buf)
    y, err := binary.ReadUvarint(bytes.NewBuffer(buf))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%2d %2d %v\n", y, len(buf), buf)
}

输出:

4294967295 10 [0 0 0 0 0 0 0 0 0 0]
4294967295  5 [255 255 255 255 15]
4294967295  5 [255 255 255 255 15]
相关问题