C# 用键值对来构建数据并将其序列化成字节数组 Key_Len_Data版本

以键值对的形式构建数据,并最终将其转成字节数组,浪费时间写的代码估计用不上了,也没多做测试,扔了可惜,保存一下,供以后学习研究

修改一个bug,BitConverter.GetBytes(val)没有sbyte和byte的重载,如果传入sbyte和byte的化,会默认调用short的重载,由于sbyte可以隐式转成short,编辑器不会提醒。。。

所以这就是为什么每个类型我都弄一个KV子类的原因了,KV_Int8,这样就不会粗心大意了吧

我重写了sbyte和byte的GetBytes函数,来解决无法给Bytes赋值的问题,虽然原本设计很怪,但是每个子类都能各施其职实现自己的功能就很不错

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using PL;

namespace ConsoleApp {
    class Program {
        static void Main(string[] args) {
            try {
                Test();
            } catch (Exception ex) {
                Console.WriteLine(ex.ToString());
            }
            Console.WriteLine("end");
            Console.ReadKey();
        }
        static void Test() {
            BitConverter.GetBytes((byte)1);
            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;
            }
            public override int GetBytes(ref List<byte> list) {
                list.Add(Key);
                list.Add(0x00);
                list.Add(0x00);
                list.Add(0x00);
                list.Add(0x01);
                list.Add((byte)Val);
                return 1 + 4 + 1;
            }
        }
        public class KV_UInt8 : KV {
            public byte Val;
            public KV_UInt8(byte key, byte val) : base(key) {
                Val = val;
            }
            public override int GetBytes(ref List<byte> list) {
                list.Add(Key);
                list.Add(0x00);
                list.Add(0x00);
                list.Add(0x00);
                list.Add(0x01);
                list.Add(Val);
                return 1 + 4 + 1;
            }
        }
        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);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/luludongxu/p/14922964.html