1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dxsoft-DxValue

Клонировать/Скачать
DxMsgPackCoder.go 22 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
huping Отправлено 13.07.2019 08:10 6cc63a2
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
package DxValue
import (
"github.com/suiyunonghen/DxValue/Coders/DxMsgPack"
"github.com/suiyunonghen/DxCommonLib"
"unsafe"
"time"
"io"
"github.com/suiyunonghen/DxValue/Coders"
"encoding/binary"
"bytes"
"errors"
)
type DxMsgPackDecoder struct{
DxMsgPack.MsgPackDecoder
}
func (coder *DxMsgPackDecoder)DecodeStrMapKvRecord(strMap *DxRecord,strcode DxMsgPack.MsgPackCode)(error) {
keybt,err := coder.DecodeString(strcode)
if err != nil{
return err
}
if strcode,err = coder.ReadCode();err!=nil{
return err
}
keyName := DxCommonLib.FastByte2String(keybt)
if strcode.IsStr(){
if keybt,err = coder.DecodeString(strcode);err!=nil{
return err
}
strMap.SetString(keyName,DxCommonLib.FastByte2String(keybt))
}else if strcode.IsFixedNum(){
strMap.SetInt32(keyName,int32(int8(strcode)))
}else if strcode.IsInt(){
if i64,err := coder.DecodeInt(strcode);err!=nil{
return err
}else{
strMap.SetInt64(keyName,i64)
}
}else if strcode.IsMap(){
if baseV,err := coder.DecodeUnknownMap(strcode);err!=nil{
return err
}else{
strMap.SetBaseValue(keyName,baseV)
}
}else if strcode.IsArray(){
if arr,err := coder.DecodeArray(strcode);err!=nil{
return err
}else{
strMap.SetArray(keyName,arr)
}
}else if strcode.IsBin(){
if bin,err := coder.DecodeBinary(strcode);err!=nil{
return err
} else{
strMap.SetBinary(keyName,bin,true,BET_Base64)
}
}else if strcode.IsExt(){
if bin ,err := coder.DecodeExtValue(strcode);err!=nil{
return err
}else{
if len(bin) == 13 && int8(bin[0]) == -1{ //96位日期格式
//32位纳秒,64位秒
nsec := binary.BigEndian.Uint32(bin[1:5])
sec := binary.BigEndian.Uint64(bin[5:])
ntime := time.Unix(int64(sec), int64(nsec))
strMap.SetDateTime(keyName, DxCommonLib.Time2DelphiTime(&ntime))
}else{
strMap.SetExtValue(keyName,bin)
}
}
}else{
switch strcode {
case DxMsgPack.CodeTrue: strMap.SetBool(keyName,true)
case DxMsgPack.CodeFalse: strMap.SetBool(keyName,false)
case DxMsgPack.CodeNil: strMap.SetNull(keyName)
case DxMsgPack.CodeFloat:
if v32,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
strMap.SetFloat(keyName,*(*float32)(unsafe.Pointer(&v32)))
}
case DxMsgPack.CodeDouble:
if v64,err := coder.ReadBigEnd64();err!=nil{
return err
}else{
strMap.SetDouble(keyName,*(*float64)(unsafe.Pointer(&v64)))
}
case DxMsgPack.CodeFixExt4:
if strcode,err = coder.ReadCode();err!=nil{
return err
}
if int8(strcode) == -1{
if ms,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
ntime := time.Now()
ns := ntime.Unix()
ntime = ntime.Add((time.Duration(int64(ms) - ns)*time.Second))
strMap.SetDateTime(keyName, DxCommonLib.Time2DelphiTime(&ntime))
}
}else{
var mb [5]byte
if err = coder.Read(mb[1:]);err!=nil{
return err
}
mb[0] = byte(strcode)
strMap.SetExtValue(keyName,mb[:])
}
case DxMsgPack.CodeFixExt8: //64位时间格式
if strcode,err = coder.ReadCode();err!=nil{
return err
}
if int8(strcode) == -1{
//30位纳秒,34位秒
if sec,err := coder.ReadBigEnd64();err!=nil{
return err
}else{
nsec := int64(sec >> 34)
sec &= 0x00000003ffffffff
ntime := time.Unix(int64(sec), nsec)
strMap.SetDateTime(keyName, DxCommonLib.Time2DelphiTime(&ntime))
}
}else{
var mb [9]byte
if err = coder.Read(mb[1:]);err!=nil{
return err
}
mb[0] = byte(strcode)
strMap.SetExtValue(keyName,mb[:])
}
}
}
return nil
}
func (coder *DxMsgPackDecoder)DecodeUnkown()(*DxBaseValue,error) {
code,err := coder.ReadCode()
if err!=nil{
return nil,err
}
if code.IsStr(){
if stbt,err := coder.DecodeString(code);err!=nil{
return nil,err
}else{
v := DxStringValue{}
v.fvalue = DxCommonLib.FastByte2String(stbt)
v.fValueType = DVT_String
return &v.DxBaseValue,nil
}
}else if code.IsFixedNum(){
var v DxInt32Value
v.fvalue = int32(int8(code))
v.fValueType = DVT_Int32
return &v.DxBaseValue,nil
}else if code.IsInt(){
if i64,err := coder.DecodeInt(code);err!=nil{
return nil,err
}else{
var v DxIntValue
v.fvalue = int(i64)
v.fValueType = DVT_Int
return &v.DxBaseValue,nil
}
}else if code.IsMap(){
return coder.DecodeUnknownMap(code)
}else if code.IsArray(){
arr := NewArray()
if err := coder.Decode2Array(code,arr);err!=nil{
return nil,err
}
return &arr.DxBaseValue,nil
}else if code.IsBin(){
if bin,err := coder.DecodeBinary(code);err!=nil{
return nil,err
}else{
var v DxBinaryValue
v.fValueType = DVT_Binary
v.fbinary = bin
return &v.DxBaseValue,nil
}
}else if code.IsExt(){
if bin,err := coder.DecodeExtValue(code);err!=nil{
return nil,err
}else {
var v DxExtValue
v.fValueType = DVT_Ext
v.fExtType = bin[0]
v.fdata = bin
}
} else{
switch code {
case DxMsgPack.CodeTrue:
var v DxBoolValue
v.fvalue = true
v.fValueType = DVT_Bool
return &v.DxBaseValue,nil
case DxMsgPack.CodeFalse:
var v DxBoolValue
v.fvalue = false
v.fValueType = DVT_Bool
return &v.DxBaseValue,nil
case DxMsgPack.CodeNil: return nil,nil
case DxMsgPack.CodeFloat:
if v32,err := coder.ReadBigEnd32();err!=nil{
return nil,err
}else{
var v DxFloatValue
v.fvalue = *(*float32)(unsafe.Pointer(&v32))
v.fValueType = DVT_Float
return &v.DxBaseValue,nil
}
case DxMsgPack.CodeDouble:
if v64,err := coder.ReadBigEnd64();err!=nil{
return nil,err
}else{
var v DxDoubleValue
v.fvalue = *(*float64)(unsafe.Pointer(&v64))
v.fValueType = DVT_Double
return &v.DxBaseValue,nil
}
case DxMsgPack.CodeFixExt4:
if code,err = coder.ReadCode();err!=nil{
return nil,err
}
if int8(code) == -1{
if ms,err := coder.ReadBigEnd32();err!=nil{
return nil,err
}else{
ntime := time.Now()
ns := ntime.Unix()
ntime = ntime.Add((time.Duration(int64(ms) - ns)*time.Second))
var v DxDoubleValue
v.fvalue = float64(DxCommonLib.Time2DelphiTime(&ntime))
v.fValueType = DVT_DateTime
return &v.DxBaseValue,nil
}
}else{
var mb [5]byte
if err = coder.Read(mb[1:]);err!=nil{
return nil,err
}
mb[0] = byte(code)
var v DxExtValue
v.fValueType = DVT_Ext
v.fExtType = mb[0]
v.fdata = mb[:]
return &v.DxBaseValue,nil
}
}
}
return nil,nil
}
func (coder *DxMsgPackDecoder)DecodeIntKeyMapKvRecord(intKeyMap *DxIntKeyRecord,keycode DxMsgPack.MsgPackCode)(error) {
intKey,err := coder.DecodeInt(keycode)
if err != nil{
return err
}
if keycode,err = coder.ReadCode();err!=nil{
return err
}
if keycode.IsStr(){
if strbt,err := coder.DecodeString(keycode);err!=nil{
return err
}else{
intKeyMap.SetString(intKey,DxCommonLib.FastByte2String(strbt))
}
}else if keycode.IsFixedNum(){
intKeyMap.SetInt32(intKey,int32(int8(keycode)))
}else if keycode.IsInt(){
if i64,err := coder.DecodeInt(keycode);err!=nil{
return err
}else{
intKeyMap.SetInt64(intKey,i64)
}
}else if keycode.IsMap(){
if baseV,err := coder.DecodeUnknownMap(keycode);err!=nil{
return err
}else{
intKeyMap.SetBaseValue(intKey,baseV)
}
}else if keycode.IsArray(){
if arr,err := coder.DecodeArray(keycode);err!=nil{
return err
}else{
intKeyMap.SetArray(intKey,arr)
}
}else if keycode.IsBin(){
if bin,err := coder.DecodeBinary(keycode);err!=nil{
return err
} else{
intKeyMap.SetBinary(intKey,bin,true)
}
}else if keycode.IsExt(){
if bin ,err := coder.DecodeExtValue(keycode);err!=nil{
return err
}else{
intKeyMap.SetExtValue(intKey,bin)
}
}else{
switch keycode {
case DxMsgPack.CodeTrue: intKeyMap.SetBool(intKey,true)
case DxMsgPack.CodeFalse: intKeyMap.SetBool(intKey,false)
case DxMsgPack.CodeNil: intKeyMap.SetNull(intKey)
case DxMsgPack.CodeFloat:
if v32,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
intKeyMap.SetFloat(intKey,*(*float32)(unsafe.Pointer(&v32)))
}
case DxMsgPack.CodeDouble:
if v64,err := coder.ReadBigEnd64();err!=nil{
return err
}else{
intKeyMap.SetDouble(intKey,*(*float64)(unsafe.Pointer(&v64)))
}
case DxMsgPack.CodeFixExt4:
if keycode,err = coder.ReadCode();err!=nil{
return err
}
if int8(keycode) == -1{
if ms,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
ntime := time.Now()
ns := ntime.Unix()
ntime = ntime.Add((time.Duration(int64(ms) - ns)*time.Second))
intKeyMap.SetDateTime(intKey, DxCommonLib.Time2DelphiTime(&ntime))
}
}else{
var mb [5]byte
if err = coder.Read(mb[1:]);err!=nil{
return err
}
mb[0] = byte(keycode)
intKeyMap.SetExtValue(intKey,mb[:])
}
}
}
return nil
}
func (coder *DxMsgPackDecoder)DecodeArrayElement(arr *DxArray,eleIndex int)(error) {
code,err := coder.ReadCode()
if err!=nil{
return err
}
if code.IsStr(){
if stbt,err := coder.DecodeString(code);err!=nil{
return err
}else{
arr.SetString(eleIndex,DxCommonLib.FastByte2String(stbt))
}
}else if code.IsFixedNum(){
arr.SetInt32(eleIndex,int32(int8(code)))
}else if code.IsInt(){
if i64,err := coder.DecodeInt(code);err!=nil{
return err
}else{
arr.SetInt64(eleIndex,i64)
}
}else if code.IsMap(){
if mpbv,err := coder.DecodeUnknownMap(code);err!=nil{
return err
}else{
arr.SetBaseValue(eleIndex,mpbv)
}
}else if code.IsArray(){
if carr,err := coder.DecodeArray(code);err!=nil{
return err
}else{
arr.SetArray(eleIndex,carr)
}
}else if code.IsBin(){
if bin,err := coder.DecodeBinary(code);err!=nil{
return err
}else{
arr.SetBinary(eleIndex,bin)
}
}else if code.IsExt(){
if bin,err := coder.DecodeExtValue(code);err!=nil{
return err
}else {
arr.SetExtValue(eleIndex,bin)
}
} else{
switch code {
case DxMsgPack.CodeTrue: arr.SetBool(eleIndex,true)
case DxMsgPack.CodeFalse: arr.SetBool(eleIndex,false)
case DxMsgPack.CodeNil: arr.SetNull(eleIndex)
case DxMsgPack.CodeFloat:
if v32,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
arr.SetFloat(eleIndex,*(*float32)(unsafe.Pointer(&v32)))
}
case DxMsgPack.CodeDouble:
if v64,err := coder.ReadBigEnd64();err!=nil{
return err
}else{
arr.SetDouble(eleIndex,*(*float64)(unsafe.Pointer(&v64)))
}
case DxMsgPack.CodeFixExt4:
if code,err = coder.ReadCode();err!=nil{
return err
}
if int8(code) == -1{
if ms,err := coder.ReadBigEnd32();err!=nil{
return err
}else{
ntime := time.Now()
ns := ntime.Unix()
ntime = ntime.Add((time.Duration(int64(ms) - ns)*time.Second))
arr.SetDateTime(eleIndex, DxCommonLib.Time2DelphiTime(&ntime))
}
}else{
var mb [5]byte
if err = coder.Read(mb[1:]);err!=nil{
return err
}
mb[0] = byte(code)
arr.SetExtValue(eleIndex,mb[:])
}
}
}
return nil
}
func (coder *DxMsgPackDecoder)DecodeArray(code DxMsgPack.MsgPackCode)(*DxArray,error) {
var (
err error
arrlen int
)
if code == DxMsgPack.CodeUnkonw{
if code,err = coder.ReadCode();err!=nil{
return nil,err
}
}
if arrlen,err = coder.DecodeArrayLen(code);err!=nil{
return nil,err
}
arr := NewArray()
for i := 0;i<arrlen;i++{
if err = coder.DecodeArrayElement(arr,i);err!=nil{
return nil,err
}
}
return arr,nil
}
func (coder *DxMsgPackDecoder)Decode2Array(code DxMsgPack.MsgPackCode,arr *DxArray)(error) {
var (
err error
arrlen int
)
if code == DxMsgPack.CodeUnkonw{
if code,err = coder.ReadCode();err!=nil{
return err
}
}
if arrlen,err = coder.DecodeArrayLen(code);err!=nil{
return err
}
for i := 0;i<arrlen;i++{
if err = coder.DecodeArrayElement(arr,i);err!=nil{
return err
}
}
return nil
}
func (coder *DxMsgPackDecoder)DecodeUnknownMap(code DxMsgPack.MsgPackCode)(*DxBaseValue,error) {
if maplen,err := coder.DecodeMapLen(code);err!=nil{
return nil, err
}else if maplen > 0{
//判断键值,是Int还是str
var baseV *DxBaseValue
if code,err = coder.ReadCode();err!=nil{
return nil,err
}
if code.IsInt(){
iMap := NewIntKeyRecord()
baseV = &iMap.DxBaseValue
if err = coder.DecodeIntKeyMapKvRecord(iMap,code);err!=nil{
return nil,err
}
for j := 1;j<maplen;j++{
if err = coder.DecodeIntKeyMapKvRecord(iMap,DxMsgPack.CodeUnkonw);err!=nil{
return nil,err
}
}
return baseV,nil
}else if code.IsStr(){
iMap := NewRecord()
baseV = &iMap.DxBaseValue
if err = coder.DecodeStrMapKvRecord(iMap,code);err!=nil{
return nil,err
}
for j := 1;j<maplen;j++{
if err = coder.DecodeStrMapKvRecord(iMap,DxMsgPack.CodeUnkonw);err!=nil{
return nil,err
}
}
return baseV,nil
}
return nil,DxMsgPack.ErrInvalidateMapKey
}else{
return nil, nil
}
}
func (coder *DxMsgPackDecoder)DecodeStrMap(code DxMsgPack.MsgPackCode,rec *DxRecord)error {
var err error
if code == DxMsgPack.CodeUnkonw{
if code,err = coder.ReadCode();err!=nil{
return err
}
}
maplen := 0
switch code {
case DxMsgPack.CodeMap16:
if v16,err := coder.ReadBigEnd16();err!=nil{
return err
}else {
maplen = int(v16)
}
case DxMsgPack.CodeMap32:
if v32,err := coder.ReadBigEnd32();err!=nil{
return err
}else {
maplen = int(v32)
}
default:
if code >= DxMsgPack.CodeFixedMapLow && code<= DxMsgPack.CodeFixedMapHigh{
maplen = int(code & 0xf)
}
}
for i := 0;i<maplen;i++{
if err = coder.DecodeStrMapKvRecord(rec,DxMsgPack.CodeUnkonw);err!=nil{
return err
}
}
return nil
}
func (coder *DxMsgPackDecoder)DecodeIntKeyMap(code DxMsgPack.MsgPackCode,rec *DxIntKeyRecord)error {
var err error
if code == DxMsgPack.CodeUnkonw{
if code,err = coder.ReadCode();err!=nil{
return err
}
}
maplen := 0
switch code {
case DxMsgPack.CodeMap16:
if v16,err := coder.ReadBigEnd16();err!=nil{
return err
}else {
maplen = int(v16)
}
case DxMsgPack.CodeMap32:
if v32,err := coder.ReadBigEnd32();err!=nil{
return err
}else {
maplen = int(v32)
}
default:
if code >= DxMsgPack.CodeFixedMapLow && code<= DxMsgPack.CodeFixedMapHigh{
maplen = int(code & 0xf)
}
}
for i := 0;i<maplen;i++{
if err = coder.DecodeIntKeyMapKvRecord(rec,DxMsgPack.CodeUnkonw);err!=nil{
return err
}
}
return nil
}
func (coder *DxMsgPackDecoder)Decode(v *DxBaseValue)(error) {
switch v.ValueType() {
case DVT_Array:
arrlen,err := coder.DecodeArrayLen(DxMsgPack.CodeUnkonw)
if err !=nil{
return err
}
arr := (*DxArray)(unsafe.Pointer(v))
arr.TruncateArray(arrlen)
for i := 0;i<arrlen;i++{
if err = coder.DecodeArrayElement(arr,i);err!=nil{
return err
}
}
case DVT_DateTime:
if dt,err := coder.DecodeDateTime(DxMsgPack.CodeUnkonw);err !=nil{
return err
}else{
v.SetDateTime(dt)
}
case DVT_Int,DVT_Int32,DVT_Int64:
if i64,err := coder.DecodeInt(DxMsgPack.CodeUnkonw);err!=nil{
return err
}else {
v.SetInt64(i64)
}
case DVT_Float,DVT_Double:
if vf,err := coder.DecodeFloat(DxMsgPack.CodeUnkonw);err!=nil{
return err
}else{
v.SetDouble(vf)
}
case DVT_Ext:
if vb,err := coder.DecodeExtValue(DxMsgPack.CodeUnkonw);err!=nil{
return err
}else{
v.SetExtValue(vb)
}
case DVT_Bool:
if code,err := coder.ReadCode();err!=nil{
return err
}else if code == DxMsgPack.CodeFalse{
v.SetBool(false)
}else if code == DxMsgPack.CodeTrue{
v.SetBool(true)
}
case DVT_Binary:
if bt,err := coder.DecodeBinary(DxMsgPack.CodeUnkonw);err!=nil{
return err
}else{
v.SetBinary(bt)
}
case DVT_Record:
rec,_ := v.AsRecord()
return coder.DecodeStrMap(DxMsgPack.CodeUnkonw,rec)
case DVT_RecordIntKey:
rec,_ := v.AsIntRecord()
return coder.DecodeIntKeyMap(DxMsgPack.CodeUnkonw,rec)
}
coder.UnreadByte()
return Coders.ErrValueType
}
func (dcoder *DxMsgPackDecoder)DecodeStand(v interface{})(error) {
switch value := v.(type) {
case *DxRecord:
return dcoder.DecodeStrMap(DxMsgPack.CodeUnkonw,value)
case DxRecord:
return errors.New("must pointer value")
case *DxArray:
arrlen,err := dcoder.DecodeArrayLen(DxMsgPack.CodeUnkonw)
if err !=nil{
return err
}
value.TruncateArray(arrlen)
for i := 0;i<arrlen;i++{
if err = dcoder.DecodeArrayElement(value,i);err!=nil{
return err
}
}
return nil
case DxArray:
return errors.New("must pointer value")
case *DxIntKeyRecord:
return dcoder.DecodeIntKeyMap(DxMsgPack.CodeUnkonw,value)
case DxIntKeyRecord:
return errors.New("must pointer value")
default:
return dcoder.MsgPackDecoder.DecodeStand(v)
}
}
func NewDecoder(r io.Reader)*DxMsgPackDecoder {
var result DxMsgPackDecoder
result.ReSetReader(r)
return &result
}
type DxMsgPackEncoder struct{
DxMsgPack.MsgPackEncoder
}
func (encoder *DxMsgPackEncoder)EncodeExtValue(v *DxExtValue)(err error) {
btlen := uint(0)
bt := v.ExtData()
btlen = uint(len(bt))
buf := encoder.Buffer()
buf[1] = v.ExtType()
switch {
case btlen == 1:
buf[0] = byte(DxMsgPack.CodeFixExt1)
err = encoder.Write(buf[:1])
case btlen == 2:
buf[0] = byte(DxMsgPack.CodeFixExt2)
err = encoder.Write(buf[:1])
case btlen == 4:
buf[0] = byte(DxMsgPack.CodeFixExt4)
err = encoder.Write(buf[:1])
case btlen == 8:
buf[0] = byte(DxMsgPack.CodeFixExt8)
err = encoder.Write(buf[:1])
case btlen <= 16:
buf[0] = byte(DxMsgPack.CodeFixExt16)
err = encoder.Write(buf[:1])
case btlen <= DxMsgPack.Max_str8_len:
buf[0] = byte(DxMsgPack.CodeExt8)
buf[1] = byte(btlen)
buf[2] = v.ExtType()
err = encoder.Write(buf[:3])
case btlen <= DxMsgPack.Max_str16_len:
buf[0] = byte(DxMsgPack.CodeExt16)
binary.BigEndian.PutUint16(buf[1:3],uint16(btlen))
buf[3] = v.ExtType()
err = encoder.Write(buf[:4])
default:
if btlen > DxMsgPack.Max_str32_len{
btlen = DxMsgPack.Max_str32_len
}
buf[0] = 0xc6
binary.BigEndian.PutUint32(buf[1:5],uint32(btlen))
buf[5] = v.ExtType()
err = encoder.Write(buf[:6])
}
if err == nil && btlen > 0{
err = encoder.Write(bt[:btlen])
}
return
}
func (encoder *DxMsgPackEncoder)EncodeRecord(r *DxRecord)(err error) {
maplen := uint(r.Length())
if maplen <= DxMsgPack.Max_fixmap_len{ //fixmap
err = encoder.WriteByte(0x80 | byte(maplen))
}else if maplen <= DxMsgPack.Max_map16_len{
//写入长度
err = encoder.WriteUint16(uint16(maplen),DxMsgPack.CodeMap16)
}else{
if maplen > DxMsgPack.Max_map32_len{
maplen = DxMsgPack.Max_map32_len
}
err = encoder.WriteUint32(uint32(maplen),DxMsgPack.CodeMap32)
}
if err != nil{
return
}
//写入对象信息,Kv对
for k,v := range r.fRecords{
if err = encoder.EncodeString(k);err!=nil{
return err
}
if v != nil{
err = encoder.Encode(v)
}else{
err = encoder.WriteByte(0xc0) //null
}
if err!=nil{
return err
}
}
return nil
}
func (encoder *DxMsgPackEncoder)EncodeRecordIntKey(r *DxIntKeyRecord)(err error) {
maplen := uint(r.Length())
if maplen <= DxMsgPack.Max_fixmap_len{ //fixmap
err = encoder.WriteByte(0x80 | byte(maplen))
}else if maplen <= DxMsgPack.Max_map16_len{
//写入长度
err = encoder.WriteUint16(uint16(maplen),DxMsgPack.CodeMap16)
}else{
if maplen > DxMsgPack.Max_map32_len{
maplen = DxMsgPack.Max_map32_len
}
err = encoder.WriteUint32(uint32(maplen),DxMsgPack.CodeMap32)
}
if err != nil{
return
}
//写入对象信息,Kv对
for k,v := range r.fRecords{
if err = encoder.EncodeInt(k);err!=nil{
return err
}
if v != nil{
err = encoder.Encode(v)
}else{
err = encoder.WriteByte(0xc0) //null
}
if err!=nil{
return err
}
}
return nil
}
func (encoder *DxMsgPackEncoder)Encode(v *DxBaseValue)(err error) {
switch v.ValueType() {
case DVT_Record:
err = encoder.EncodeRecord((*DxRecord)(unsafe.Pointer(v)))
case DVT_RecordIntKey:
err = encoder.EncodeRecordIntKey((*DxIntKeyRecord)(unsafe.Pointer(v)))
case DVT_Int:
return encoder.EncodeInt(int64((*DxIntValue)(unsafe.Pointer(v)).fvalue))
case DVT_Int32:
return encoder.EncodeInt(int64((*DxInt32Value)(unsafe.Pointer(v)).fvalue))
case DVT_Int64:
return encoder.EncodeInt((*DxInt64Value)(unsafe.Pointer(v)).fvalue)
case DVT_Bool:
return encoder.EncodeBool((*DxBoolValue)(unsafe.Pointer(v)).fvalue)
case DVT_String:
return encoder.EncodeString((*DxStringValue)(unsafe.Pointer(v)).fvalue)
case DVT_Float:
return encoder.EncodeFloat((*DxFloatValue)(unsafe.Pointer(v)).fvalue)
case DVT_Double:
return encoder.EncodeDouble((*DxDoubleValue)(unsafe.Pointer(v)).fvalue)
case DVT_Binary:
bt := (*DxBinaryValue)(unsafe.Pointer(v)).fbinary
if bt != nil{
return encoder.EncodeBinary(bt)
}else{
return encoder.WriteByte(0xc0)
}
case DVT_Ext:
return encoder.EncodeExtValue((*DxExtValue)(unsafe.Pointer(v)))
case DVT_Array:
return encoder.EncodeArray((*DxArray)(unsafe.Pointer(v)))
case DVT_DateTime:
return encoder.EncodeDateTime(DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(v)).fvalue))
default:
return encoder.WriteByte(0xc0) //null
}
return nil
}
func (encoder *DxMsgPackEncoder)EncodeArray(arr *DxArray)(err error) {
arlen := uint(arr.Length())
switch {
case arlen < 16: //1001XXXX| N objects
err = encoder.WriteByte(byte(DxMsgPack.CodeFixedArrayLow) | byte(arlen))
case arlen <= DxMsgPack.Max_map16_len: //0xdc |YYYYYYYY|YYYYYYYY| N objects
encoder.WriteUint16(uint16(arlen),DxMsgPack.CodeArray16)
default:
if arlen > DxMsgPack.Max_map32_len{
arlen = DxMsgPack.Max_map32_len
}
encoder.WriteUint32(uint32(arlen),DxMsgPack.CodeArray32)
}
for i := 0;i <= int(arlen - 1);i++{
vbase := arr.AsBaseValue(i)
if vbase == nil{
err = encoder.WriteByte(0xc0) //null
}else{
err = encoder.Encode(vbase)
}
if err != nil{
return
}
}
return err
}
func (encoder *DxMsgPackEncoder)EncodeStand(v interface{})(error) {
switch value := v.(type) {
case *DxRecord:
return encoder.EncodeRecord(value)
case DxRecord:
return encoder.EncodeRecord(&value)
case *DxArray:
return encoder.EncodeArray(value)
case DxArray:
return encoder.EncodeArray(&value)
case *DxIntKeyRecord:
return encoder.EncodeRecordIntKey(value)
case DxIntKeyRecord:
return encoder.EncodeRecordIntKey(&value)
default:
return encoder.MsgPackEncoder.EncodeStand(v)
}
}
func NewEncoder(w io.Writer) *DxMsgPackEncoder {
var result DxMsgPackEncoder
result.Buffer()
result.ReSet(w)
return &result
}
func Marshal(v...interface{})([]byte,error) {
var buf bytes.Buffer
coder := NewEncoder(&buf)
for _,value := range v{
if err := coder.EncodeStand(value);err!=nil{
return nil,err
}
}
return buf.Bytes(),nil
}
func Unmarshal(data []byte, v...interface{}) error {
coder := NewDecoder(bytes.NewReader(data))
for _,vdst := range v{
if err := coder.DecodeStand(vdst);err!=nil{
return err
}
}
return nil
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/dxsoft-DxValue.git
git@api.gitlife.ru:oschina-mirror/dxsoft-DxValue.git
oschina-mirror
dxsoft-DxValue
dxsoft-DxValue
master