buffers

buffers


Examples of how to allocate a buffer, write in big or little endian format, encode to a hex string, and check if buffers are equal.

Node.js

const buf = Buffer.alloc(6)

let value = 0x1234567890ab
let offset = 0
let byteLength = 6

buf.writeUIntBE(value, offset, byteLength)

let hexstr = buf.toString('hex')
console.log(hexstr)

const buf2 = Buffer.alloc(6)

value = 0x1234567890ab
offset = 0
byteLength = 6

buf2.writeUIntLE(value, offset, byteLength)

hexstr = buf2.toString('hex')
console.log(hexstr)

let isEqual = Buffer.compare(buf, buf2) === 0
console.log(isEqual)

isEqual = Buffer.compare(buf, buf) === 0
console.log(isEqual)

Output

1234567890ab
ab9078563412
false
true

Go

package main

import (
    "bytes"
    "encoding/binary"
    "encoding/hex"
    "fmt"
    "log"
    "math/big"
    "reflect"
)

func writeUIntBE(buffer []byte, value, offset, byteLength int64) {
    slice := make([]byte, byteLength)
    val := new(big.Int)
    val.SetUint64(uint64(value))
    valBytes := val.Bytes()

    buf := bytes.NewBuffer(slice)
    err := binary.Write(buf, binary.BigEndian, &valBytes)
    if err != nil {
        log.Fatal(err)
    }

    slice = buf.Bytes()
    slice = slice[int64(len(slice))-byteLength : len(slice)]

    copy(buffer[offset:], slice)
}

func writeUIntLE(buffer []byte, value, offset, byteLength int64) {
    slice := make([]byte, byteLength)
    val := new(big.Int)
    val.SetUint64(uint64(value))
    valBytes := val.Bytes()

    tmp := make([]byte, len(valBytes))
    for i := range valBytes {
        tmp[i] = valBytes[len(valBytes)-1-i]
    }

    copy(slice, tmp)
    copy(buffer[offset:], slice)
}

func main() {
    buf := make([]byte, 6)
    writeUIntBE(buf, 0x1234567890ab, 0, 6)

    fmt.Println(hex.EncodeToString(buf))

    buf2 := make([]byte, 6)
    writeUIntLE(buf2, 0x1234567890ab, 0, 6)

    fmt.Println(hex.EncodeToString(buf2))

    isEqual := reflect.DeepEqual(buf, buf2)
    fmt.Println(isEqual)

    isEqual = reflect.DeepEqual(buf, buf)
    fmt.Println(isEqual)
}

Output

1234567890ab
ab9078563412
false
true