public void DecodeFromStream(Stream ms) { byte lvByte = (byte)ms.ReadByte(); byte[] rawByte = null; MsgPack msgPack = null; int len = 0; int i = 0; if (lvByte <= 0x7F) { //positive fixint 0xxxxxxx 0x00 - 0x7f SetAsInteger(lvByte); }else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) { //fixmap 1000xxxx 0x80 - 0x8f this.Clear(); this.valueType = MsgPackType.Map; len = lvByte - 0x80; for (i=0; i<len;i++) { msgPack = InnerAdd(); msgPack.SetName(ReadTools.ReadString(ms)); msgPack.DecodeFromStream(ms); } } else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f { //fixmap 1000xxxx 0x80 - 0x8f this.Clear(); this.valueType = MsgPackType.Array; len = lvByte - 0x90; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.DecodeFromStream(ms); } } else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf { len = lvByte - 0xA0; SetAsString(ReadTools.ReadString(ms, len)); } else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) { /// -1..-32 // negative fixnum stores 5-bit negative integer // +--------+ // |111YYYYY| // +--------+ SetAsInteger((sbyte)lvByte); } else if (lvByte == 0xC0) { SetAsNull(); } else if (lvByte == 0xC1) { throw new Exception("(never used) type $c1"); } else if (lvByte == 0xC2) { SetAsBoolean(false); } else if (lvByte == 0xC3) { SetAsBoolean(true); } else if (lvByte == 0xC4) { // max 255 len = ms.ReadByte(); rawByte = new byte[len]; ms.Read(rawByte, 0, len); SetAsBytes(rawByte); } else if (lvByte == 0xC5) { // max 65535 rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt16(rawByte, 0); // read binary rawByte = new byte[len]; ms.Read(rawByte, 0, len); SetAsBytes(rawByte); } else if (lvByte == 0xC6) { // binary max: 2^32-1 rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt32(rawByte, 0); // read binary rawByte = new byte[len]; ms.Read(rawByte, 0, len); SetAsBytes(rawByte); } else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) { throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); } else if (lvByte == 0xCA) { // float 32 rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); SetAsSingle(BitConverter.ToSingle(rawByte, 0)); } else if (lvByte == 0xCB) { // float 64 rawByte = new byte[8]; ms.Read(rawByte, 0, 8); rawByte = BytesTools.SwapBytes(rawByte); SetAsFloat(BitConverter.ToDouble(rawByte, 0)); } else if (lvByte == 0xCC) { // uint8 // uint 8 stores a 8-bit unsigned integer // +--------+--------+ // | 0xcc |ZZZZZZZZ| // +--------+--------+ lvByte =(byte)ms.ReadByte(); SetAsInteger(lvByte); } else if (lvByte == 0xCD) { // uint16 // uint 16 stores a 16-bit big-endian unsigned integer // +--------+--------+--------+ // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| // +--------+--------+--------+ rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); } else if (lvByte == 0xCE) { // uint 32 stores a 32-bit big-endian unsigned integer // +--------+--------+--------+--------+--------+ // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ // +--------+--------+--------+--------+--------+ rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); } else if (lvByte == 0xCF) { // uint 64 stores a 64-bit big-endian unsigned integer // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ rawByte = new byte[8]; ms.Read(rawByte, 0, 8); rawByte = BytesTools.SwapBytes(rawByte); SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); } else if (lvByte == 0xDC) { // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt16(rawByte, 0); this.Clear(); this.valueType = MsgPackType.Array; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.DecodeFromStream(ms); } } else if (lvByte == 0xDD) { // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt16(rawByte, 0); this.Clear(); this.valueType = MsgPackType.Array; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.DecodeFromStream(ms); } } else if (lvByte == 0xD9) { // str 8 stores a byte array whose length is upto (2^8)-1 bytes: // +--------+--------+========+ // | 0xd9 |YYYYYYYY| data | // +--------+--------+========+ SetAsString(ReadTools.ReadString(lvByte, ms)); } else if (lvByte == 0xDE) { // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToUInt16(rawByte, 0); this.Clear(); this.valueType = MsgPackType.Map; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.SetName(ReadTools.ReadString(ms)); msgPack.DecodeFromStream(ms); } } else if (lvByte == 0xDE) { // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt16(rawByte, 0); this.Clear(); this.valueType = MsgPackType.Map; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.SetName(ReadTools.ReadString(ms)); msgPack.DecodeFromStream(ms); } } else if (lvByte == 0xDF) { // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); len = BitConverter.ToInt32(rawByte, 0); this.Clear(); this.valueType = MsgPackType.Map; for (i = 0; i < len; i++) { msgPack = InnerAdd(); msgPack.SetName(ReadTools.ReadString(ms)); msgPack.DecodeFromStream(ms); } } else if (lvByte == 0xDA) { // str 16 stores a byte array whose length is upto (2^16)-1 bytes: // +--------+--------+--------+========+ // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | // +--------+--------+--------+========+ SetAsString(ReadTools.ReadString(lvByte, ms)); } else if (lvByte == 0xDB) { // str 32 stores a byte array whose length is upto (2^32)-1 bytes: // +--------+--------+--------+--------+--------+========+ // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | // +--------+--------+--------+--------+--------+========+ SetAsString(ReadTools.ReadString(lvByte, ms)); } else if (lvByte == 0xD0) { // int 8 stores a 8-bit signed integer // +--------+--------+ // | 0xd0 |ZZZZZZZZ| // +--------+--------+ SetAsInteger((sbyte)ms.ReadByte()); } else if (lvByte == 0xD1) { // int 16 stores a 16-bit big-endian signed integer // +--------+--------+--------+ // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| // +--------+--------+--------+ rawByte = new byte[2]; ms.Read(rawByte, 0, 2); rawByte = BytesTools.SwapBytes(rawByte); SetAsInteger(BitConverter.ToInt16(rawByte, 0)); } else if (lvByte == 0xD2) { // int 32 stores a 32-bit big-endian signed integer // +--------+--------+--------+--------+--------+ // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| // +--------+--------+--------+--------+--------+ rawByte = new byte[4]; ms.Read(rawByte, 0, 4); rawByte = BytesTools.SwapBytes(rawByte); SetAsInteger(BitConverter.ToInt32(rawByte, 0)); } else if (lvByte == 0xD3) { // int 64 stores a 64-bit big-endian signed integer // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ rawByte = new byte[8]; ms.Read(rawByte, 0, 8); rawByte = BytesTools.SwapBytes(rawByte); SetAsInteger(BitConverter.ToInt64(rawByte, 0)); } }