2017-01-23 10 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にはseekメソッドがないので、オフセットに 'Write 'することはできません。オフセットに「書き込む」唯一の方法は、バッファされたスライスを取り出して、そのインデックスに具体的に書き込むことです。 – JimB

+0

私は参照してください。それが事実なら、これは私の唯一の選択肢です。私は私の質問を更新しました。確認できますか? – majidarif

関連する問題