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 に変換する必要がありますが、結果が同じでないのはなぜですか? 行くバージョン: ベータ 1.1

4

4 に答える 4

13

これは、パッケージのByteOrderオブジェクトの 1 つを使用して行うことができます。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])

または

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 をバイト スライスで直接使用してください。

  • 関数によって返されたエラーを破棄しています。2 番目の結果は、読み取られたバイト数または問題があったかどうかを示します。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 と] Varints は、1 つ以上のバイトを使用して整数をエンコードする方法です。絶対値が小さい数値ほど、バイト数が少なくなります。仕様については、 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 に答える