1. 程式人生 > 其它 >C# 用鍵值對來構建資料並將其序列化成位元組陣列 Key_Len_Data版本

C# 用鍵值對來構建資料並將其序列化成位元組陣列 Key_Len_Data版本

以鍵值對的形式構建資料,並最終將其轉成位元組陣列,浪費時間寫的程式碼估計用不上了,也沒多做測試,扔了可惜,儲存一下,供以後學習研究

static void Test() {
            KV_Object kv = new KV_Object(0x00);
            kv.Add(new KV_Int32(0x00, 200));
            KV_Object kv1 = new KV_Object(0x01);
            kv.Add(kv1);
            kv1.Add(new KV_Int32(0x00, 255));
            List
<byte> list = new List<byte>(); kv.GetBytes(ref list); byte[] bytes = list.ToArray(); } public abstract class KV { public byte Key { get; private set; } public byte[] Bytes { get; protected set; } public KV(byte key) { Key
= key; } public virtual int GetBytes(ref List<byte> list) { list.Add(Key); list.AddRange(BitConverter.GetBytes(Bytes.Length).Reverse().ToArray()); list.AddRange(Bytes); return 1 + 4 + Bytes.Length; } }
public class KV_Object : KV { public List<KV> Val; public KV_Object(byte key) : base(key) { Val = new List<KV>(); } public void Add(KV kv) { Val.Add(kv); } public override int GetBytes(ref List<byte> list) { list.Add(Key); int offset = list.Count; list.Add(0x00); list.Add(0x00); list.Add(0x00); list.Add(0x00); int len = 0; foreach (KV kv in Val) { len += kv.GetBytes(ref list); } byte[] lenBytes = BitConverter.GetBytes(len).Reverse().ToArray(); list[offset++] = lenBytes[0]; list[offset++] = lenBytes[1]; list[offset++] = lenBytes[2]; list[offset++] = lenBytes[3]; return 1 + 4 + len; } } public class KV_Boolean : KV { public bool Val; public KV_Boolean(byte key, bool val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(Val); } } public class KV_Int8 : KV { public sbyte Val; public KV_Int8(byte key, sbyte val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(Val); } } public class KV_UInt8 : KV { public byte Val; public KV_UInt8(byte key, byte val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(Val); } } public class KV_Int16 : KV { public short Val; public KV_Int16(byte key, short val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(Val).Reverse().ToArray(); } } public class KV_UInt16 : KV { public ushort Val; public KV_UInt16(byte key, ushort val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(Val).Reverse().ToArray(); } } public class KV_Int32 : KV { public int Val; public KV_Int32(byte key, int val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_UInt32 : KV { public uint Val; public KV_UInt32(byte key, uint val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_Int64 : KV { public long Val; public KV_Int64(byte key, long val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_UInt64 : KV { public ulong Val; public KV_UInt64(byte key, ulong val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_Float : KV { public float Val; public KV_Float(byte key, float val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_Double : KV { public double Val; public KV_Double(byte key, double val) : base(key) { Val = val; Bytes = BitConverter.GetBytes(val).Reverse().ToArray(); } } public class KV_ByteArray : KV { public byte[] Val; public KV_ByteArray(byte key, byte[] val) : base(key) { Val = val; Bytes = val; } } public class KV_String : KV { public string Val; public KV_String(byte key, string val) : base(key) { Val = val; Bytes = Encoding.UTF8.GetBytes(val); } }