第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將[8] byte轉(zhuǎn)換為uint64

將[8] byte轉(zhuǎn)換為uint64

Go
www說 2021-05-12 13:13:18
全部。我遇到了一個(gè)看起來很奇怪的問題。(可能是我應(yīng)該睡著了很久了,而我卻忽略了一些明顯的事情。)[]byte由于進(jìn)行了十六進(jìn)制解碼,我的長(zhǎng)度為8。我需要產(chǎn)生一個(gè)uint64才能使用它。我嘗試使用binary.Uvarint()fromencoding/binary來做,但是似乎只使用數(shù)組中的第一個(gè)字節(jié)??紤]以下示例。package mainimport (    "encoding/binary"    "fmt")func main() {    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}    num, _ := binary.Uvarint(array[0:8])    fmt.Printf("%v, %x\n", array, num)}它在play.golang.org上。運(yùn)行該命令時(shí),即使顯示為numas 0,即使以十六進(jìn)制顯示也應(yīng)為000108000801ab01。此外,如果從中捕獲了第二個(gè)值binary.Uvarint(),則它是從緩沖區(qū)讀取的字節(jié)數(shù),據(jù)我所知,即使實(shí)際上是1,也應(yīng)為8。我是在解釋這個(gè)錯(cuò)誤嗎?如果是這樣,我應(yīng)該改用什么?
查看完整描述

3 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

您正在使用一種功能進(jìn)行解碼,而該功能的用途并非您所需要的:


Varint是一種使用一個(gè)或多個(gè)字節(jié)對(duì)整數(shù)進(jìn)行編碼的方法。絕對(duì)值較小的數(shù)字占用較少的字節(jié)數(shù)。有關(guān)規(guī)范,請(qǐng)參見 http://code.google.com/apis/protocolbuffers/docs/encoding.html。


它不是標(biāo)準(zhǔn)編碼,而是一個(gè)非常具體的可變字節(jié)數(shù)編碼。這就是為什么它在值小于0x080的第一個(gè)字節(jié)處停止。


正如Stephen所指出的,binary.BigEndian和binary.LittleEndian提供了直接解碼的有用函數(shù):


type ByteOrder interface {

    Uint16([]byte) uint16

    Uint32([]byte) uint32

    Uint64([]byte) uint64

    PutUint16([]byte, uint16)

    PutUint32([]byte, uint32)

    PutUint64([]byte, uint64)

    String() string

}

所以你可以用


package main


import (

    "encoding/binary"

    "fmt"

)


func main() {

    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}

    num := binary.LittleEndian.Uint64(array)

    fmt.Printf("%v, %x", array, num)

}

或(如果您想檢查錯(cuò)誤而不是恐慌,請(qǐng)感謝jimt使用直接解決方案指出此問題):


package main


import (

    "encoding/binary"

    "bytes"

    "fmt"

)


func main() {

    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}

    var num uint64

    err := binary.Read(bytes.NewBuffer(array[:]), binary.LittleEndian, &num)

    fmt.Printf("%v, %x", array, num)

}


查看完整回答
反對(duì) 回復(fù) 2021-05-24
  • 3 回答
  • 0 關(guān)注
  • 434 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)