2014-03-18 141 views
18

我試圖在GoLang中將[]uint8字節數組轉換爲float64。我無法在線找到此問題的解決方案。我已經看到了轉換爲字符串,然後到float64的建議,但這似乎不起作用,它失去了它的價值,我最終成爲零。在GoLang中將字節數組「[] uint8」轉換爲float64

例子:

metric.Value, _ = strconv.ParseFloat(string(column.Value), 64) 

而且它不工作...

+1

什麼是字節數組包含哪些內容? – cnicutar

+1

發佈數據示例 –

+2

如果意外獲得零值並忽略返回的錯誤,那麼檢查該錯誤值得嗎? –

回答

36

例如,

package main 

import (
    "encoding/binary" 
    "fmt" 
    "math" 
) 

func Float64frombytes(bytes []byte) float64 { 
    bits := binary.LittleEndian.Uint64(bytes) 
    float := math.Float64frombits(bits) 
    return float 
} 

func Float64bytes(float float64) []byte { 
    bits := math.Float64bits(float) 
    bytes := make([]byte, 8) 
    binary.LittleEndian.PutUint64(bytes, bits) 
    return bytes 
} 

func main() { 
    bytes := Float64bytes(math.Pi) 
    fmt.Println(bytes) 
    float := Float64frombytes(bytes) 
    fmt.Println(float) 
} 

輸出:

[24 45 68 84 251 33 9 64] 
3.141592653589793 
+0

奇怪的是,你拖欠小尾數。網絡字節順序在互聯網上越來越多,並且......問道。 – Dustin

+0

除了我們使用BigEndian之外,就是這樣。謝謝先生! – user3435186

+0

這些天,小尾數幾乎是普遍的。即使是現代網絡協議也使用它(這是有道理的 - 幾乎所有的處理器都是小端的,所以你只需要在兩端毫無意義地交換字節)。 – Timmmm

3

我想從圍棋文檔這個例子,你在找什麼: http://golang.org/pkg/encoding/binary/#example_Read

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) 

打印3.141592653589793

4

隨着評論閱讀,我這完全取決於您在[]uint8切片中擁有哪種數據。

如果它是以Little Endian順序表示IEEE 754浮點值的字節,則使用Kluyg's或peterSo(更好的性能而不使用反射)答案。

如果它是拉美-1/UTF-8編碼的文本表示,那麼你應該能夠做到你剛纔所做的:

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    var f float64 
    text := []uint8("1.23") // A decimal value represented as Latin-1 text 

    f, err := strconv.ParseFloat(string(text), 64) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Println(f) 
} 

結果:

1.23

遊樂場:http://play.golang.org/p/-7iKRDG_ZM

2

我希望這有助於破解。它的目的是將長長的二進制數字流轉換爲浮點數。

例如: 0110111100010010100000111100000011001010001000010000100111000000 - > -3.1415

func binFloat(bin string) float64 { 

    var s1 []byte 
    var result float64 

    if len(bin) % 8 == 0 { 

      for i := 0; i < len(bin)/8; i++ { 

        //Chop the strings into a segment with a length of 8. 
        //Convert the string to Integer and to byte 

        num, _ := strconv.ParseInt(bin[8*i: 8*(i + 1)], 2, 64) 
        //Store the byte into a slice s1 
        s1 = append(s1, byte(num)) 
      } 

    } 

    //convert the byte slice to a float64. 
    //The algorithm below are copied from golang binary examples. 

    buf := bytes.NewReader(s1) 

    //You can also change binary.LittleEndian to binary.BigEndian 
    //For the details of Endianness, please google Endianness 

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

    if err != nil { 

      panic(err) 
      fmt.Println("Length of the binary is not in the length of 8") 
    } 

    return result 
} 
+0

發帖時請更加清楚,有時候發佈代碼和示例是不夠的,請編輯您的答案並加以更多解釋。 – EyadMhanna

+1

我會相應地修改它。這是我在StackOverflow上的第一篇文章。對不起,不遵守StackOverflow中的規定。 –

相關問題