csjiabin's blog csjiabin's blog
首页
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
  • 学习笔记

    • 《面向Node.js开发者的Go》
更多
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

csjiabin

前端界的小菜鸟
首页
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
  • 学习笔记

    • 《面向Node.js开发者的Go》
更多
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • comments
  • printing
  • logging
  • variables
  • interpolation
  • types
  • type check
  • if/else
  • for
  • while
  • switch
  • arrays
  • uint8 arrays
  • array iteration
  • array sorting
  • buffers
    • maps
    • objects
    • functions
    • default values
    • destructuring
    • spread operator
    • rest operator
    • swapping
    • classes
    • generators
    • datetime
    • timeout
    • interval
    • IIFE
    • files
    • json
    • big numbers
    • promises
    • async await
    • streams
    • event emitter
    • errors
    • try/catch
    • exceptions
    • regex
    • exec
    • tcp server
    • udp server
    • http server
    • url parse
    • gzip
    • dns
    • crypto
    • env vars
    • cli args
    • cli flags
    • stdout
    • stderr
    • stdin
    • modules
    • stack trace
    • databases
    • testing
    • benchmarking
    • documentation
    • 《面向Nodejs开发者的Go》
    miguelmota
    2022-09-29
    目录

    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);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    Output

    1234567890ab
    ab9078563412
    false
    true
    
    1
    2
    3
    4

    # 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)
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62

    Output

    1234567890ab
    ab9078563412
    false
    true
    
    1
    2
    3
    4
    编辑 (opens new window)
    #Go#Node.js
    上次更新: 2022/09/30, 11:34:22
    array sorting
    maps

    ← array sorting maps→

    最近更新
    01
    咖啡知识
    10-13
    02
    documentation
    09-29
    03
    benchmarking
    09-29
    更多文章>
    Theme by Vdoing | Copyright © 2018-2022 csjiabin | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式