2016-07-24 14 views
1

我現在有一個protobuf的結構,看起來像這樣:如何打開答:64的片成字節的片

type RequestEnvelop_MessageQuad struct { 
    F1 [][]byte `protobuf:"bytes,1,rep,name=f1,proto3" json:"f1,omitempty"` 
    F2 []byte `protobuf:"bytes,2,opt,name=f2,proto3" json:"f2,omitempty"` 
    Lat float64 `protobuf:"fixed64,3,opt,name=lat" json:"lat,omitempty"` 
    Long float64 `protobuf:"fixed64,4,opt,name=long" json:"long,omitempty"` 
} 

F1需要,我已經像這樣產生了一些S2幾何數據:

ll := s2.LatLngFromDegrees(location.Latitude, location.Longitude) 
cid := s2.CellIDFromLatLng(ll).Parent(15) 
walkData := []uint64{cid.Pos()} 

next := cid.Next() 
prev := cid.Prev() 

// 10 Before, 10 After 
for i := 0; i < 10; i++ { 
    walkData = append(walkData, next.Pos()) 
    walkData = append(walkData, prev.Pos()) 

    next = next.Next() 
    prev = prev.Prev() 
} 

log.Println(walkData) 

唯一的問題是,protobuf結構預計[][]byte類型我只是不知道我怎麼能得到我的uint64數據字節。謝謝。

回答

0

整數值可以用標準庫中的encoding/binary包編碼成字節數組。

例如,在uint64編碼成字節的緩衝區,我們可以使用binary.PutUvarint功能:

big := uint64(257) 
buf := make([]byte, 2) 
n := binary.PutUvarint(buf, big) 
fmt.Printf("Wrote %d bytes into buffer: [% x]\n", n, buf) 

這將打印:

Wrote 2 bytes into buffer: [81 02] 

我們也可以寫一個通用流到緩衝區使用binary.Write功能:

buf := new(bytes.Buffer) 
var pi float64 = math.Pi 
err := binary.Write(buf, binary.LittleEndian, pi) 
if err != nil { 
    fmt.Println("binary.Write failed:", err) 
} 
fmt.Printf("% x", buf.Bytes()) 

,輸出:

18 2d 44 54 fb 21 09 40 

(第二個例子是借來的從包文件,在那裏你會找到其他simliar例子)