jsでbigendian
2-byte big-endianをjsで扱うにはどうした良いか。単純に考えると、下記の形式になる。
const packet = Buffer.allocUnsafe(2 + 16 + data.length + 16);
packet.writeUInt16BE(data.length, 0);
data.copy(packet, 2 + 16);
LNDの場合はどうやっているかというと、、、
まずメッセージをbufferにエンコードする。
// Encode the message payload itself into a temporary buffer.
// TODO(roasbeef): create buffer pool
var bw bytes.Buffer
if err := msg.Encode(&bw, pver); err != nil {
return totalBytes, err
}
そして、typeをBEで記述
// With the initial sanity checks complete, we'll now write out the
// message type itself.
var mType [2]byte
binary.BigEndian.PutUint16(mType[:], uint16(msg.MsgType()))
n, err := w.Write(mType[:])
その後はそこにbufferを追加する。
// With the message type written, we'll now write out the raw payload
// itself.
n, err = w.Write(payload)
のだけれど、このpayloadはbigendianで書かなくて良いのか? なるほど、golangではbinary.Writeメソッドに構造体を渡すと上から順番にフィールドが並んだバイナリになるのか。これでいいな。