8
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 但为什么结果不一样?去版本:beta 1.1

4

4 回答 4

13

您可以使用包中的其中一个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.

于 2013-04-06T14:30:44.717 回答
5
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

为乐。

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

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

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

于 2013-04-06T08:57:15.050 回答
4

以下是如何使用encoding/binary包来做你想做的事。请注意,您不想使用任何var函数,因为它们进行可变长度编码。

游乐场版

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
于 2013-04-06T10:04:30.983 回答
-1

数值类型

byte        alias for uint8

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

如何在 Go 中将 [4]uint8 转换为 uint32?

包二进制

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

由于Uvarints 是整数表示和存储的一种特殊形式,因此您应该只对使用该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]
于 2013-04-06T13:20:45.993 回答