private void WirteArray(Stream ms) { byte b; byte[] lenBytes; int len = children.Count; if (len <= 15) { b = (byte)(0x90 + (byte)len); ms.WriteByte(b); } else if (len <= 65535) { b = 0xDC; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); ms.Write(lenBytes, 0, lenBytes.Length); } else { b = 0xDD; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); ms.Write(lenBytes, 0, lenBytes.Length); } for (int i = 0; i < len; i++) { ((MsgPack)children[i]).Encode2Stream(ms); } }
public byte[] GetAsBytes() { switch (this.valueType) { case MsgPackType.Integer: return(BitConverter.GetBytes((Int64)this.innerValue)); case MsgPackType.String: return(BytesTools.GetUtf8Bytes(this.innerValue.ToString())); case MsgPackType.Float: return(BitConverter.GetBytes((Double)this.innerValue)); case MsgPackType.Single: return(BitConverter.GetBytes((Single)this.innerValue)); case MsgPackType.DateTime: long dateval = ((DateTime)this.innerValue).ToBinary(); return(BitConverter.GetBytes(dateval)); case MsgPackType.Binary: return((byte[])this.innerValue); default: return(new byte[] { }); } }
public static void WriteBinary(Stream ms, byte[] rawBytes) { byte[] lenBytes = null; int len = rawBytes.Length; byte b = 0; if (len <= 255) { b = 0xC4; ms.WriteByte(b); b = (byte)len; ms.WriteByte(b); } else if (len <= 65535) { b = 0xC5; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); ms.Write(lenBytes, 0, lenBytes.Length); } else { b = 0xC6; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); ms.Write(lenBytes, 0, lenBytes.Length); } ms.Write(rawBytes, 0, rawBytes.Length); }
private void WriteMap(Stream ms) { byte b; byte[] lenBytes; int len = children.Count; if (len <= 15) { b = (byte)(0x80 + (byte)len); ms.WriteByte(b); } else if (len <= 65535) { b = 0xDE; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); ms.Write(lenBytes, 0, lenBytes.Length); } else { b = 0xDF; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); ms.Write(lenBytes, 0, lenBytes.Length); } for (int i = 0; i < len; i++) { WriteTools.WriteString(ms, children[i].name); children[i].Encode2Stream(ms); } }
public static String ReadString(byte strFlag, Stream ms) { // //fixstr stores a byte array whose length is upto 31 bytes: //+--------+========+ //|101XXXXX| data | //+--------+========+ // //str 8 stores a byte array whose length is upto (2^8)-1 bytes: //+--------+--------+========+ //| 0xd9 |YYYYYYYY| data | //+--------+--------+========+ // //str 16 stores a byte array whose length is upto (2^16)-1 bytes: //+--------+--------+--------+========+ //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | //+--------+--------+--------+========+ // //str 32 stores a byte array whose length is upto (2^32)-1 bytes: //+--------+--------+--------+--------+--------+========+ //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | //+--------+--------+--------+--------+--------+========+ // //where //* XXXXX is a 5-bit unsigned integer which represents N //* YYYYYYYY is a 8-bit unsigned integer which represents N //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N //* N is the length of data byte[] rawBytes = null; int len = 0; if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) { len = strFlag - 0xA0; } else if (strFlag == 0xD9) { len = ms.ReadByte(); } else if (strFlag == 0xDA) { rawBytes = new byte[2]; ms.Read(rawBytes, 0, 2); rawBytes = BytesTools.SwapBytes(rawBytes); len = BitConverter.ToUInt16(rawBytes, 0); } else if (strFlag == 0xDB) { rawBytes = new byte[4]; ms.Read(rawBytes, 0, 4); rawBytes = BytesTools.SwapBytes(rawBytes); len = BitConverter.ToInt32(rawBytes, 0); } rawBytes = new byte[len]; ms.Read(rawBytes, 0, len); return(BytesTools.GetString(rawBytes)); }
public static void WriteInteger(Stream ms, Int64 iVal) { if (iVal >= 0) { // 正数 if (iVal <= 127) { ms.WriteByte((byte)iVal); } else if (iVal <= 255) { //UInt8 ms.WriteByte(0xCC); ms.WriteByte((byte)iVal); } else if (iVal <= (UInt32)0xFFFF) { //UInt16 ms.WriteByte(0xCD); ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); } else if (iVal <= (UInt32)0xFFFFFFFF) { //UInt32 ms.WriteByte(0xCE); ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); } else { //Int64 ms.WriteByte(0xD3); ms.Write(BytesTools.SwapInt64(iVal), 0, 8); } } else { // <0 if (iVal <= Int32.MinValue) //-2147483648 // 64 bit { ms.WriteByte(0xD3); ms.Write(BytesTools.SwapInt64(iVal), 0, 8); } else if (iVal <= Int16.MinValue) // -32768 // 32 bit { ms.WriteByte(0xD2); ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); } else if (iVal <= -128) // -32768 // 32 bit { ms.WriteByte(0xD1); ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); } else if (iVal <= -32) { ms.WriteByte(0xD0); ms.WriteByte((byte)iVal); } else { ms.WriteByte((byte)iVal); } } // end <0 }
public static String ReadString(Stream ms, int len) { byte[] rawBytes = new byte[len]; ms.Read(rawBytes, 0, len); return(BytesTools.GetString(rawBytes)); }
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.ToUInt16(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.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 == 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)); } }
public static void WriteUInt64(Stream ms, UInt64 iVal) { ms.WriteByte(0xCF); byte[] dataBytes = BitConverter.GetBytes(iVal); ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); }
public static void WriteString(Stream ms, String strVal) { // //fixstr stores a byte array whose length is upto 31 bytes: //+--------+========+ //|101XXXXX| data | //+--------+========+ // //str 8 stores a byte array whose length is upto (2^8)-1 bytes: //+--------+--------+========+ //| 0xd9 |YYYYYYYY| data | //+--------+--------+========+ // //str 16 stores a byte array whose length is upto (2^16)-1 bytes: //+--------+--------+--------+========+ //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | //+--------+--------+--------+========+ // //str 32 stores a byte array whose length is upto (2^32)-1 bytes: //+--------+--------+--------+--------+--------+========+ //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | //+--------+--------+--------+--------+--------+========+ // //where //* XXXXX is a 5-bit unsigned integer which represents N //* YYYYYYYY is a 8-bit unsigned integer which represents N //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N //* N is the length of data byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); byte[] lenBytes = null; int len = rawBytes.Length; byte b = 0; if (len <= 31) { b = (byte)(0xA0 + (byte)len); ms.WriteByte(b); } else if (len <= 255) { b = 0xD9; ms.WriteByte(b); b = (byte)len; ms.WriteByte(b); } else if (len <= 65535) { b = 0xDA; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); ms.Write(lenBytes, 0, lenBytes.Length); } else { b = 0xDB; ms.WriteByte(b); lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); ms.Write(lenBytes, 0, lenBytes.Length); } ms.Write(rawBytes, 0, rawBytes.Length); }
public static void WriteSingle(Stream ms, Single fVal) { ms.WriteByte(0xCA); ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); }
public static void WriteFloat(Stream ms, Double fVal) { ms.WriteByte(0xCB); ms.Write(BytesTools.SwapDouble(fVal), 0, 8); }