2017-01-23 92 views
0

我正在嘗試編寫一個遊戲服務器,並且需要創建數據包,我將發送回客戶端。我將所有數據寫入bytes.Buffer,然後我想在獲取字節並將其發送到客戶端之前,將數據包的總大小加上前綴。在字節的特定偏移處寫入。緩衝區

我在想是這樣的:

// is it bad to call `var b bytes.Buffer` every time I create a packet? 
func CreatePacket() []byte { 
    var b bytes.Buffer 

    // size 
    binary.Write(b, binary.LittleEndian, 0) // insert at end 

    // body (variable number of writes) 
    binary.Write(b, binary.LittleEndian, data) 

    // update the size at offset 0 
    binary.Write(b, binary.LittleEndian, b.Len()) 

    return b.Bytes() 
} 

但我找不到任何方法來尋求或修改偏移。


這不行,爲什麼?

var packet = b.Bytes() 

// the size is really at offset 2. offset 0 is an ID. 
binary.LittleEndian.PutUint16(packet, uint16(0xF3)) 
binary.LittleEndian.PutUint16(packet, uint16(len(packet))) 
+0

沒關係的最後一個問題,我想它了。 'binary.LittleEndian.PutUint16(packet [2:],uint16(len(packet)))' – majidarif

回答

1

在組裝完數據包後,可以直接將長度寫入切片。您還需要指定長度前綴大小,以便跨平臺相同。

func CreatePacket(data []byte) []byte { 
    // leave 4 bytes at the start for the ID and length 
    b := bytes.NewBuffer(make([]byte, 4)) 

    binary.Write(b, binary.LittleEndian, data) 
    packet := b.Bytes() 

    // insert the ID and prefix 
    binary.LittleEndian.PutUint16(packet, uint16(0xF3)) 
    binary.LittleEndian.PutUint16(packet[2:], uint16(len(packet))) 
    return packet 
} 

https://play.golang.org/p/35IX1c18a4

+0

這可以工作,但它仍然沒有真正解決插入到偏移量的問題。謝謝。 – majidarif

+0

@majidarif:Tis插入在偏移量0處,您可以根據需要進行更改。你不能'寫'到一個偏移量,因爲一個bytes.buffer沒有一個查找方法。 「寫入」偏移量的唯一方法是採用緩衝切片並專門寫入該索引。 – JimB

+0

我明白了。如果是這樣的話,這是我唯一的選擇。我更新了我的問題。你可以檢查一下嗎? – majidarif