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

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 中的類型。
- 2 回答
- 0 關(guān)注
- 303 瀏覽
添加回答
舉報