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メソッドに構造体を渡すと上から順番にフィールドが並んだバイナリになるのか。これでいいな。