- package binary
-
- import (
- "bytes"
- "time"
- )
-
- type Codec interface {
- Write(interface{}) ([]byte, error)
- Read([]byte) (interface{}, error)
- }
-
- const (
- typeNil = byte(0x00)
- typeByte = byte(0x01)
- typeInt8 = byte(0x02)
- // typeUInt8 = byte(0x03)
- typeInt16 = byte(0x04)
- typeUInt16 = byte(0x05)
- typeInt32 = byte(0x06)
- typeUInt32 = byte(0x07)
- typeInt64 = byte(0x08)
- typeUInt64 = byte(0x09)
- typeString = byte(0x10)
- typeByteSlice = byte(0x11)
- typeTime = byte(0x20)
- )
-
- var BasicCodec = basicCodec{}
-
- type basicCodec struct{}
-
- func (bc basicCodec) Write(o interface{}) ([]byte, error) {
- n, err, w := new(int64), new(error), new(bytes.Buffer)
- switch o.(type) {
- case nil:
- WriteByte(w, typeNil, n, err)
- case byte:
- WriteByte(w, typeByte, n, err)
- WriteByte(w, o.(byte), n, err)
- case int8:
- WriteByte(w, typeInt8, n, err)
- WriteInt8(w, o.(int8), n, err)
- //case uint8:
- // WriteByte(w, typeUInt8, n, err)
- // WriteUInt8(w, o.(uint8), n, err)
- case int16:
- WriteByte(w, typeInt16, n, err)
- WriteInt16(w, o.(int16), n, err)
- case uint16:
- WriteByte(w, typeUInt16, n, err)
- WriteUInt16(w, o.(uint16), n, err)
- case int32:
- WriteByte(w, typeInt32, n, err)
- WriteInt32(w, o.(int32), n, err)
- case uint32:
- WriteByte(w, typeUInt32, n, err)
- WriteUInt32(w, o.(uint32), n, err)
- case int64:
- WriteByte(w, typeInt64, n, err)
- WriteInt64(w, o.(int64), n, err)
- case uint64:
- WriteByte(w, typeUInt64, n, err)
- WriteUInt64(w, o.(uint64), n, err)
- case string:
- WriteByte(w, typeString, n, err)
- WriteString(w, o.(string), n, err)
- case []byte:
- WriteByte(w, typeByteSlice, n, err)
- WriteByteSlice(w, o.([]byte), n, err)
- case time.Time:
- WriteByte(w, typeTime, n, err)
- WriteTime(w, o.(time.Time), n, err)
- default:
- panic("Unsupported type")
- }
- return w.Bytes(), *err
- }
-
- func (bc basicCodec) Read(bz []byte) (interface{}, error) {
- n, err, r, o := new(int64), new(error), bytes.NewBuffer(bz), interface{}(nil)
- type_ := ReadByte(r, n, err)
- switch type_ {
- case typeNil:
- o = nil
- case typeByte:
- o = ReadByte(r, n, err)
- case typeInt8:
- o = ReadInt8(r, n, err)
- //case typeUInt8:
- // o = ReadUInt8(r, n, err)
- case typeInt16:
- o = ReadInt16(r, n, err)
- case typeUInt16:
- o = ReadUInt16(r, n, err)
- case typeInt32:
- o = ReadInt32(r, n, err)
- case typeUInt32:
- o = ReadUInt32(r, n, err)
- case typeInt64:
- o = ReadInt64(r, n, err)
- case typeUInt64:
- o = ReadUInt64(r, n, err)
- case typeString:
- o = ReadString(r, n, err)
- case typeByteSlice:
- o = ReadByteSlice(r, n, err)
- case typeTime:
- o = ReadTime(r, n, err)
- default:
- panic("Unsupported type")
- }
- return o, *err
- }
|