Archive

Posts Tagged ‘binary’

golang Byte数组转换为浮点数

January 8th, 2012 No comments

今天没事想用go从文件中提取些二进制数据,并把数据转换为相关的数据类型, 就找到一个把数组转换为float类型的数据。主要用到了encoding/binary包里面的read函数, 它可以根据你数据的大小端得到相关的数据类型。

主要代码如下:

package main

import (
“bytes”
“encoding/binary”
“fmt”
)

func main() {
var pi float64
b := []byte{0×18, 0x2d, 0×44, 0×54, 0xfb, 0×21, 0×09, 0×40}
buf := bytes.NewBuffer(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println(“binary.Read failed:”, err)
}
fmt.Println(pi)
}

下面是go里面uint32在大小端的分别实现:

bvcom@bvcomtv:~$ godoc -src encoding/binary Uint32
// A ByteOrder specifies how to convert byte sequences into
// 16-, 32-, or 64-bit unsigned integers.
type ByteOrder interface {
Uint32([]byte) uint32
// contains filtered or unexported methods
}

func (littleEndian) Uint32(b []byte) uint32 {
return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func (bigEndian) Uint32(b []byte) uint32 {
return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}

参考:
Convert 8 byte array to int64? Options:  http://groups.google.com/group/golang-nuts/browse_thread/thread/7f541090fd7d1bd4

Reading byte array as another datatype Options: http://groups.google.com/group/golang-nuts/browse_thread/thread/fc00115bf5b35757

http://golang.org/src/pkg/encoding/binary/binary.go?s=3435:3501#L117

–EOF–