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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 []byte 轉(zhuǎn)為 Little/Big-Endian 有符號整數(shù)或浮點數(shù)?

將 []byte 轉(zhuǎn)為 Little/Big-Endian 有符號整數(shù)或浮點數(shù)?

Go
HUX布斯 2021-12-07 09:24:42
我能夠轉(zhuǎn)換[]byte為無符號整數(shù):a := binary.LittleEndian.Uint16(sampleA)b := binary.BigEndian.Uint32(sampleB)這利用了 Go 包https://golang.org/src/encoding/binary/binary.go 中的 BigEndian 和 LittleEndian 類型 。Uint16()然而,這提供了沒有等效的Int16()或Float32()。關(guān)于為什么不的任何想法?另外,這應(yīng)該怎么做?
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗 獲得超6個贊

將數(shù)字類型轉(zhuǎn)換為一系列字節(jié) ( []byte),反之亦然,這與字節(jié)序有關(guān)。您如何解釋結(jié)果完全取決于您。


您所需要的只是組合一個 16 位、32 位或 64 位的值,一旦完成,您就可以根據(jù)需要解釋結(jié)果。


例如,如果您已經(jīng)有一個uint16值,要將其用作有符號值,您只需要進(jìn)行類型轉(zhuǎn)換,因為uint16and的內(nèi)存布局int16是相同的(從uint16to轉(zhuǎn)換int16不會僅更改類型的內(nèi)存表示):


a := binary.LittleEndian.Uint16(sampleA)

// If you need int16:

a2 := int16(a)

相似地:


a := binary.LittleEndian.Uint64(sampleA)

// If you need int64:

a2 := int64(a)

uint -> float 轉(zhuǎn)換的情況稍微復(fù)雜一些,因為使用簡單的類型轉(zhuǎn)換會嘗試轉(zhuǎn)換數(shù)值,而不僅僅是改變類型(因此會改變內(nèi)存表示)。


要將無符號整數(shù)轉(zhuǎn)換為浮點類型,您可以使用math包的函數(shù),即math.Float32frombits()and math.Float64frombits(),以及具有相同內(nèi)存布局的相反方向(將浮點值轉(zhuǎn)換為無符號整數(shù)):math.Float32bits()and math.Float64bits()。


例如:


a := binary.LittleEndian.Uint64(sampleA)

// If you need a float64:

a2 := math.Float64frombits(a)

如果您從math包中查看這些函數(shù)的實現(xiàn),您會發(fā)現(xiàn)內(nèi)存值/布局沒有被操縱,它只是通過使用unsafe包被“查看”為不同的類型。例如:


func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }

正如保羅所說,binary包提供Read(),并Write()因此你不需要的功能做的引擎蓋下這些轉(zhuǎn)換。


展示使用相同的“pi”示例(來自 的文檔binary.Read()):


b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}


// USING binary.Read()

var pi float64

buf := bytes.NewReader(b)

err := binary.Read(buf, binary.LittleEndian, &pi)

if err != nil {

    fmt.Println("binary.Read failed:", err)

}

fmt.Println(pi)


// Using LittleEndian.Uint64() and math.Float64frombits()

a := binary.LittleEndian.Uint64(b)

a2 := math.Float64frombits(a)

fmt.Println(a2)

輸出(在Go Playground上試試):


3.141592653589793

3.141592653589793


查看完整回答
反對 回復(fù) 2021-12-07
?
滄海一幻覺

TA貢獻(xiàn)1824條經(jīng)驗 獲得超5個贊

該ByteOrder類型提供用于解碼二進(jìn)制值的低級 API。要讀取 float64 或其他類型,您可以使用binary.Read. 二進(jìn)制包的godoc 頁面上有一個示例,我已將其復(fù)制到此處:


var pi float64

b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}

buf := bytes.NewReader(b)

err := binary.Read(buf, binary.LittleEndian, &pi)

if err != nil {

    fmt.Println("binary.Read failed:", err)

}

fmt.Print(pi)

沒有用于解碼 float16 的函數(shù),因為它不是 Go 中的類型。


查看完整回答
反對 回復(fù) 2021-12-07
  • 2 回答
  • 0 關(guān)注
  • 303 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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