public void EncodeArray(DxArrayValue value) { int arrlen = value.Count; if (arrlen < 16) //1001XXXX| N objects { databuffer.WriteByte((byte)((byte)MsgPackCode.CodeFixedArrayLow | (byte)arrlen)); } else if (arrlen <= Max_map16_len) { WriteUint16((ushort)arrlen, MsgPackCode.CodeArray16); } else { if (arrlen > Max_map32_len) { arrlen = Max_map32_len; } WriteUint32((uint)arrlen, MsgPackCode.CodeArray32); } for (int i = 0; i < arrlen; i++) { DxBaseValue vbase = value[i]; if (vbase == null) { databuffer.WriteByte((byte)MsgPackCode.CodeNil); } else { Encode(vbase); } } }
public void Encode(DxBaseValue value) { switch (value.Type) { case ValueType.VT_Map: EncodeRecord((DxRecordValue)value); break; case ValueType.VT_Array: EncodeArray((DxArrayValue)value); break; case ValueType.VT_Binary: byte[] bt = ((DxBinaryValue)value).Bytes; if (bt == null || bt.Length == 0) { databuffer.WriteByte((byte)MsgPackCode.CodeNil); } else { EncodeBinary(bt); } break; case ValueType.VT_Ext: EncodeExtValue((DxExtValue)value); break; case ValueType.VT_Boolean: EncodeBool(value.AsBoolean); break; case ValueType.VT_Int: case ValueType.VT_Int64: EncodeInt(value.AsInt64); break; case ValueType.VT_DateTime: buf[0] = (byte)MsgPackCode.CodeFixExt4; buf[1] = 0xff; databuffer.Write(buf, 0, 2); BigEndian.PutUint32(databuffer, (uint)((DxDateTimeValue)value).Unix); break; case ValueType.VT_String: EncodeString(value.AsString); break; case ValueType.VT_Float: EncodeFloat(value.AsFloat); break; case ValueType.VT_Double: EncodeDouble(value.AsDouble); break; default: databuffer.WriteByte((byte)MsgPackCode.CodeNil); break; } }