Go字节封装

Go字节封装

from 毛的工具库: https://gitee.com/maomaomaoge/go-utils.git

注意: 下面的hook函数没啥用,但是为了装逼,偶尔有用

package buff

import (
	"encoding/binary"
	"encoding/hex"
	"math"
)

type Buffer struct {
	Endian binary.ByteOrder
	Buf    []byte
	end    int
	
	pos int // 存进去字节游标

	outPos int // 取出来的字节游标
}


// func: NewBuffer(size int) *Buffer 
// aim: 小标头字节封装

func NewBuffer(size int) *Buffer {
	return &Buffer{Buf: make([]byte, size), Endian: binary.LittleEndian, end: size}
}

func NewBufferBytes(Buf []byte) *Buffer {
	return &Buffer{Buf: Buf, Endian: binary.LittleEndian, end: len(Buf)}
}

// 更改存进数据游标
func (this *Buffer) UpdatePos(pos int)  {
	this.pos += pos
}

// 更改取出字节的游标
func (this *Buffer) UpdateOutPos(outPos int)  {
	this.outPos += outPos
}

func (this *Buffer) UpdateOutPosUtils(outPos int)  {
	this.outPos = outPos
}

func (this *Buffer) Hex(pos, num int) string {
	end := pos + num
	if pos > this.end {
		return ""
	}
	if end > this.end {
		end = this.end
	}
	return hex.EncodeToString(this.Buf[pos:end])
}

func (this *Buffer) Length() int {
	return this.end
}

//重新设置为新数据
func (this *Buffer) ResetData(Buf []byte) {
	this.end = len(Buf)
	if this.end > len(this.Buf) {
		this.Buf = make([]byte, this.end)
	}
	copy(this.Buf, Buf)
}

func (this *Buffer) Clear() {
	this.end = 0
}

func (this *Buffer) Limit(end int) {
	if len(this.Buf) > end {
		this.end = end
	}
}

func (this *Buffer) Bytes() []byte {
	return this.Buf
}



// func: (this *Buffer) PutByte(value byte)
// aim: 放一个字节,游标移动1

func (this *Buffer) PutByte(value byte) {
	this.Buf[this.pos] = value
	this.UpdatePos(1)
	return
}
func (this *Buffer) Byte() (value byte) {
	value = this.Buf[this.outPos]
	this.UpdateOutPos(1)
	return
}


// func: (this *Buffer) PutUint16(pos int, value uint16) 
// aim: 放 uint16 , 游标移动2

func (this *Buffer) PutUint16(value uint16) {
	this.Endian.PutUint16(this.Buf[this.pos:], value)
	this.UpdatePos(2)
	return
}


// func: (this *Buffer) Uint16(pos int) (value uint16)
// aim: 取出Uint16

func (this *Buffer) Uint16(pos int) (value uint16) {
	value = this.Endian.Uint16(this.Buf[this.outPos:])
	this.UpdateOutPos(2)
	return
}


// func: (this *Buffer) PutUint32(pos int, value uint32)
// aim: 放uint32 , 游标移动4

func (this *Buffer) PutUint32(value uint32) {
	this.Endian.PutUint32(this.Buf[this.pos:], value)
	this.UpdatePos(4)
	return
}


// func: (this *Buffer) Uint32() (value uint32)
// aim: 取出Uint32, 字节4

func (this *Buffer) Uint32() (value uint32) {
	value = this.Endian.Uint32(this.Buf[this.outPos:])
	this.UpdateOutPos(4)
	return
}


// func: (this *Buffer)PutUint64(value uint64)
// aim: 放uint64, 8字节

func (this *Buffer)PutUint64(value uint64)  {
	this.Endian.PutUint64(this.Buf[this.pos:], value)
	this.UpdatePos(8)
	return
}


// func: (this *Buffer)Uint64() (value uint64)
// aim: 取出Uint64, 8 字节

func (this *Buffer)Uint64() (value uint64) {
	value = this.Endian.Uint64(this.Buf[this.outPos:])
	this.UpdateOutPos(8)
	return
}

// func: (this *Buffer) PutFloat(pos int, value float32) 
// aim: uint32, 4字节

func (this *Buffer) PutFloat(value float32) {
	this.Endian.PutUint32(this.Buf[this.pos:], math.Float32bits(value))
	this.UpdatePos(4)
	return
}


// func: (this *Buffer) Float32() float32
// aim: 取出float32, 实质是Uint32

func (this *Buffer) Float32() float32 {
	val := this.Endian.Uint32(this.Buf[this.outPos:])
	this.UpdateOutPos(4)
	return math.Float32frombits(val)
}


// func: (this *Buffer)PutFloat64(value uint64)
// aim: float64就是内部放的uint64, 8字节

func (this *Buffer)PutFloat64(value float64)  {
	this.Endian.PutUint64(this.Buf[this.pos:], math.Float64bits(value))
	this.UpdatePos(8)
	return
}


// func: (this *Buffer)Float64() float64
// aim: 取出float64, 实质是Uint64

func (this *Buffer)Float64() float64 {
	val := this.Endian.Uint64(this.Buf[this.outPos:])
	this.UpdateOutPos(8)
	return math.Float64frombits(val)
}


// func: (this *Buffer)PutInt16(value int16)
// aim: 放int16, 实质是PutUint16

func (this *Buffer)PutInt16(value int16)  {
	this.Endian.PutUint16(this.Buf[this.pos:], uint16(value))
	this.UpdatePos(2)
	return
}


// func: (this *Buffer)Int`6() int`6
// aim: 取出int16, 实质是实质是PutUint16

func (this *Buffer)Int16() int16 {
	val := this.Endian.Uint16(this.Buf[this.outPos:])
	this.UpdateOutPos(2)
	return int16(val)
}


// func: (this *Buffer)PutInt(value int)
// aim: 放int, 实质是PutUint32

func (this *Buffer)PutInt(value int)  {
	this.Endian.PutUint32(this.Buf[this.pos:], uint32(value))
	this.UpdatePos(4)
	return
}


// func: (this *Buffer)Int() int
// aim: 取出int, 实质是实质是PutUint32

func (this *Buffer)Int() int {
	val := this.Endian.Uint32(this.Buf[this.outPos:])
	this.UpdateOutPos(4)
	return int(val)
}


// func: (this *Buffer)PutInt64(value int64)
// aim: 放int64, 实质是PutUint64

func (this *Buffer)PutInt64(value int64)  {
	this.Endian.PutUint64(this.Buf[this.pos:], uint64(value))
	this.UpdatePos(8)
	return
}


// func: (this *Buffer)Int64() int64
// aim: 取出int64, 实质是实质是PutUint64

func (this *Buffer)Int64() int64 {
	val := this.Endian.Uint32(this.Buf[this.outPos:])
	this.UpdateOutPos(8)
	return int64(val)
}

func (this *Buffer) PutArray(value []byte) {
	copy(this.Buf[this.pos:], value)
	this.UpdatePos(len(value))
	return
}

func (this *Buffer) Array(size int) []byte {
	data :=  this.Buf[this.outPos : this.outPos+size]
	this.UpdateOutPos(size)
	return data
}


// func:  (this *Buffer) LastArray() []byte
// aim: 获取剩余字节数

func (this *Buffer) LastArray() []byte {
	data := this.Buf[this.outPos:]
	return data
}

// func: (this *Buffer)PutHook(h Hook)
// aim: hook

type Hook func(Buf *Buffer)

func (this *Buffer)PutHook(h Hook)  {
	h(this)
}

test.go

package buff

import (
	"fmt"
	"testing"
)

func getBuf() *Buffer {
	buffer := NewBuffer(30)

	return buffer
}

func TestBuffer_Byte(t *testing.T) {
	buf := getBuf()

	buf.PutByte(byte(1))

	var hook Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
		fmt.Println(buf.Buf)
	}

	buf.PutHook(hook)
}

func TestBuffer_PutUint16(t *testing.T) {
	buf := getBuf()

	buf.PutUint16(uint16(32769))

	var hook Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
		fmt.Println(buf.Buf)
	}

	buf.PutHook(hook)
}

func TestBuffer_PutUint32(t *testing.T) {
	buf := getBuf()

	buf.PutUint32(uint32(259))

	var hook Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
		fmt.Println(buf.Buf)
	}

	buf.PutHook(hook)
}

func TestBuffer_Float(t *testing.T) {
	buf := getBuf()

	buf.PutFloat(float32(259))

	var hook Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
		fmt.Println(buf.Buf)
	}

	buf.PutHook(hook)
}

type person struct {
	Id int32
	Av float64
}

func TestBuffer_Hex(t *testing.T) {
	p := &person{
		Id: 11,
		Av: float64(22.12212),
	}

	buf := getBuf()

	fmt.Println("encode")
	buf.PutUint32(uint32(p.Id))
	var hook Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
	}
	buf.PutHook(hook)

	buf.PutFloat64(float64(p.Av))
	var hook2 Hook = func(buf *Buffer) {
		fmt.Println(buf.pos)
	}
	buf.PutHook(hook2)

	fmt.Println("decode")
	value := buf.Uint32()
	fmt.Println(value)
	f := buf.Float64()
	fmt.Println(f)
}
原文地址:https://www.cnblogs.com/maomaomaoge/p/15032516.html