• 对象、字节流转换


    数据表示时间   长度(字节)   数据类型   描述及要求
    平台登入时间     6          BYTE[6]      (每个字节分别代表:年、月、日、时、分、秒)
    登入流水号           2          WORD     每登入一次,登入流水号自动加1
    平台用户名      12            STRING     平台登入用户名
    平台密码     20                     STRING   平台登入密码
    加密规则             1          BYTE          0x01:数据不加密;0x02:RSA加密;0x03:AES128加密...

    //平台登入类
    public class EvPlatformLoginMsg
    {
        public DateTime LoginTime{get;set;}
    
        public ushort SerialNumver{get;set;}
    
        public string Account{get;set}
    
        public string Password{get;set;}
    
        public EvEncryptionMode EncryptMode{get;set;}
    
        public EvPlatformLoginMsg(byte[] bytes, int offset)
        {
            EvDateTime evDateTime = new EvDateTime(bytes, offset);
            LoginTime = evDateTime.DateTime;
            offset += evDateTime.BytesSize;
    
            NetBytesUtil.EnsureNetOrder(bytes, index, 2);
            SerialNumver = BitConverter.ToUint16(bytes, index);
            offset += 2;
    
            Account = Encoding.ASCII.GetString(bytes, index, 12).TrimEnd('');
            offset += 12;
    
            Password = Encoding.ASCII.GetString(bytes, index, 20);
            offset += 20;
    
            EncryptMode = (EvEncryptionMode)bytes[index];
        }
    
        public byte[] ToBytes()
        {
            byte[] bytes = new byte[41];
            int offset = 0;
    
            offset += new EvDateTime(LoginTime).WriteToBytes(bytes, offset);
    
            BitExtend.WriteUint16ToBytes(bytes, offset, SerialNumver);
            NetBytesUtil.EnsureNetOrder(bytes, index, 2);
            index += 2;
    
            byte[] accountBytes = Encoding.ASCII.GetBytes(Account);
            Buffer.BlockCopy(accountBytes, 0, bytes, index, accountBytes.Length > 12 ? 12 : accountBytes.Length);
            index += 12;
    
            byte[] passwordBytes = Encoding.ASCII.GetBytes(Password);
            Buffer.BlockCopy(passwordBytes, 0, bytes, index, passwordBytes.Length > 20 ? 20 : passwordBytes.Length);
            index += 20;
    
            bytes[index] = (byte)EncryptMode;
    
            return bytes;
        }
    }
    
    //时间类型
    public class EvDateTime
    {
        private const int ConstBytesSize = 6;    //6个字节表示时间
    
        public DateTime DateTime 
        {
            get;
            set;
        }
    
        public EvDateTime(DateTime dateTime)
        {
            DateTime = dateTime;
        }
    
        public int BytesSize
        {
            get{return ConstBytesSize;}
            set{;}
        }
    
        public EvDateTime(byte[] bytes, int offset)
        {
            int year = byte[offset] + 2000;
            int month = byte[offset + 1];
            int day = byte[offset + 2];
            int hour = byte[offset + 3];
            int miniute = byte[offset + 4];
            int second = byte[offset + 5];
            DateTime = new DateTime(year, month, day, hour, miniute, second);
        }
    
        public int WriteToBytes(byte[] bytes, int offset)
        {
            bytes[offset] = (byte)(DateTime.Year - 2000);
            bytes[offset + 1] = (byte)DateTime.Month;
            bytes[offset + 2] = (byte)DateTime.Day;
            bytes[offset + 3] = (byte)DateTime.Hour;
            bytes[offset + 4] = (byte)DateTime.Minute;
            bytes[offset + 5] = (byte)DateTime.Second;
            return ConstBytesSize;
        }
    }
    
    //BitExtend类
    public class BitExtend
    {
        public static unsafe void WriteCharToBytes(byte[] bytes, int start, char value)
        {
            WriteInt16ToBytes(bytes, start, (short)val);
        }
    
        public static unsafe void WriteSingleToBytes(byte[] bytes, int start, float value)
        {
            WriteInt32ToBytes(bytes, start, *((int*)&value));
        }
    
        public static unsafe void WriteDoubleToBytes(byte[] bytes, int start, double value)
        {
            WriteInt64ToBytes(bytes, start, *((long*)&value));
        }
    
        public static unsafe void WriteBooleanToBytes(byte[] bytes, int start, boolean value){
            bytes[start] = value ? (byte)1 : (byte)0;
        }
    
        public static unsafe void WriteUint16ToBytes(byte[] bytes, int start, ushort value)
        {
            WriteInt16ToBytes(bytes, start, (short)value);
        }
    
        public static unsafe void WriteUint32ToBytes(byte[] bytes, int start, uint value)
        {
            WriteInt32ToBytes(bytes, start, (short)value);
        }
    
        public static unsafe void WriteUint64ToBytes(byte[] bytes, int start, ulong value)
        {
            WriteInt64ToBytes(bytes, start, (long)value);
        }
    
        public static unsafe void WriteInt32ToBytes(byte[] bytes, int start, int value)
        {
            fixed(byte* numRef = bytes)
            {
                *((int*)(numRef = start)) = value;
            }
        }
    
        public static unsafe void WriteInt16ToBytes(byte[] bytes, int start, short value)
        {
            fixed (byte* numRef = bytes)
            {
                *((short*)(numRef + start)) = value;
            }
        }
    
        public static unsafe void WriteInt32ToBytes(byte[] bytes, int start, int value)
        {
            fixed(byte* numRef = bytes)
            {
                *((int*)(numRef + start)) = value;
            }
        }
    
        public static unsafe void WriteInt64ToBytes(byte[] bytes, int start, long value)
        {
            fixed(long* numRef = bytes) 
            {
                *((long*)(numRef + start)) = value;
            }
        }
    }
    
    //网络序和本机序
    public static class NetBytesUtil
    {
        public static int[] Byte2Bits(byte b)
        {
            int[] bitArray = new int[8];
            bitArray[0] = b & 1;
            bitArray[1] = b & 2;
            bitArray[2] = b & 4;
            bitArray[3] = b & 8;
            bitArray[4] = b & 16;
            bitArray[5] = b & 32;
            bitArray[6] = b & 64;
            bitArray[7] = b & 128;
    
            return bitArray;
        }
    
        public static bool TestBit(long src, byte bitIndex)
        {
            if (src == 0)
            {
                return false;
            }
            else
            {
                return ((ulong)src & (ulong)Math.Pow(2, bitIndex)) == (ulong)Math.Pow(2, bitIndex);
            }
        }
    
        public static long SetBit(long src, byte bitIndex)
        {
            return src | (long)Math.Pow(2, bitIndex);
        }
        public static void EnsureNetOrder(byte[] bytes, int start, int size)
        {
            if (BitConverter.IsLittleEndian)
            {
                if (bytes == null)
                {
                    throw new Exception("bytes is null");
                }
                if (start < 0)
                {
                    throw new Exception("start less than 0");
                }
                if (size < 0)
                {
                    throw new Exception("size less than 0");
                }
                if (bytes.Length < start + size)
                {
                    throw new Exception("bytes length less then that start plus size");
                }
                if (size > 1)
                {
                    byte tmp;
                    for (int i = 0; i < size / 2; i++)
                    {
                        tmp = bytes[start + i];
                        bytes[start + i] = bytes[start + size - 1 - i];
                        bytes[start + size - 1 - i] = tmp;
                    }
                }
            }
        }
    
        public static void EnsureHostOrder(byte[] bytes, int start, int size)
        {
            if (!BitConverter.IsLittleEndian)
            {
                if (bytes == null)
                {
                    throw new Exception("bytes is null");
                }
                if (start < 0)
                {
                    throw new Exception("start less than 0");
                }
                if (size < 0)
                {
                    throw new Exception("size less than 0");
                }
                if (bytes.Length < start + size)
                {
                    throw new Exception("bytes length less then that start plus size");
                }
                if (size > 1)
                {
                    byte tmp;
                    for (int i = 0; i < size / 2; i++)
                    {
                        tmp = bytes[start + i];
                        bytes[start + i] = bytes[start + size - 1 - i];
                        bytes[start + size - 1 - i] = tmp;
                    }
                }
            }
        }
    
        public static void WriteIp(byte[] bytes, int start, string ip)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            if (bytes.Length < start + 4)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            if (string.IsNullOrEmpty(ip))
            {
                throw new Exception("ip is null or empty");
            }
    
            string[] array = ip.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
            if (array.Length != 4)
            {
                throw new Exception("ip format is error");
            }
    
            bytes[start] = byte.Parse(array[0]);
            bytes[start + 1] = byte.Parse(array[1]);
            bytes[start + 2] = byte.Parse(array[2]);
            bytes[start + 3] = byte.Parse(array[3]);
        }
    
        public static string ReadIp(byte[] bytes, int start)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
            if (bytes.Length < start + 4)
            {
                throw new Exception("bytes length less then that start plus size");
            }
            return string.Format("{0}.{1}.{2}.{3}", bytes[start], bytes[start + 1], bytes[start + 2], bytes[start + 3]);
        }
    
        [Obsolete]
        public static void WriteInt16ToBytes(byte[] bytes, int start, short val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 2;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
        }
    
        [Obsolete]
        public static void WriteInt32ToBytes(byte[] bytes, int start, int val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 4;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
            bytes[start + 2] = (byte)(val >> 16 & 0xff);
            bytes[start + 3] = (byte)(val >> 24 & 0xff);
        }
    
        [Obsolete]
        public static void WriteInt64ToBytes(byte[] bytes, int start, long val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 8;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
            bytes[start + 2] = (byte)(val >> 16 & 0xff);
            bytes[start + 3] = (byte)(val >> 24 & 0xff);
            bytes[start + 4] = (byte)(val >> 32 & 0xff);
            bytes[start + 5] = (byte)(val >> 40 & 0xff);
            bytes[start + 6] = (byte)(val >> 48 & 0xff);
            bytes[start + 7] = (byte)(val >> 56 & 0xff);
        }
    
        [Obsolete]
        public static void WriteInt64To5Bytes(byte[] bytes, int start, long val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 5;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
            bytes[start + 2] = (byte)(val >> 16 & 0xff);
            bytes[start + 3] = (byte)(val >> 24 & 0xff);
            bytes[start + 4] = (byte)(val >> 32 & 0xff);
            //bytes[start + 5] = (byte)(val >> 40 & 0xff);
            //bytes[start + 6] = (byte)(val >> 48 & 0xff);
            //bytes[start + 7] = (byte)(val >> 56 & 0xff);
        }
    
        [Obsolete]
        public static void WriteUInt16ToBytes(byte[] bytes, int start, ushort val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 2;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            //bytes[start] = (byte)(val & 0x11);
            //bytes[start + 1] = (byte)((val & 0x1100) >> 8);
    
            bytes[start] = (byte)(0xff & val);
            bytes[start + 1] = (byte)((0xff00 & val) >> 8);
        }
    
        [Obsolete]
        public static void WriteUInt32ToBytes(byte[] bytes, int start, uint val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 4;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
            bytes[start + 2] = (byte)(val >> 16 & 0xff);
            bytes[start + 3] = (byte)(val >> 24 & 0xff);
    
        }
    
        [Obsolete]
        public static void WriteUInt64ToBytes(byte[] bytes, int start, ulong val)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = 8;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            bytes[start] = (byte)(val & 0xff);
            bytes[start + 1] = (byte)(val >> 8 & 0xff);
            bytes[start + 2] = (byte)(val >> 16 & 0xff);
            bytes[start + 3] = (byte)(val >> 24 & 0xff);
            bytes[start + 4] = (byte)(val >> 32 & 0xff);
            bytes[start + 5] = (byte)(val >> 40 & 0xff);
            bytes[start + 6] = (byte)(val >> 48 & 0xff);
            bytes[start + 7] = (byte)(val >> 56 & 0xff);
        }
    
        public static int WriteAsc2Bytes(byte[] bytes, int start, string str)
        {
            if (bytes == null)
            {
                throw new Exception("bytes is null");
            }
            if (start < 0)
            {
                throw new Exception("start less than 0");
            }
    
            int size = str.Length;
    
            if (bytes.Length < start + size)
            {
                throw new Exception("bytes length less then that start plus size");
            }
    
            for (int i = 0; i < str.Length; i++)
            {
                try
                {
                    bytes[start + i] = Convert.ToByte(str[i]);
                }
                catch (Exception ex)
                {
                    ExceptionUtil.WriteLog(ex);
                    DebugUtil.WriteLog("错误字符" + str[i]);
                }
            }
    
            return start + size;
        }
    }
  • 相关阅读:
    8.1.1 播放合成声音
    CSS 用伪类 :after 选择器清除浮动
    javascript 拖拽
    javascript 回到顶端
    用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率
    【风马一族_代码英语】代码英语之五
    【风马一族_代码英语】代码英语之四
    【风马一族_代码英语】代码英语之三
    【风马一族_Android】第4章Android常用基本控件
    【风马一族_日常灵感】在美国得到的人生感悟
  • 原文地址:https://www.cnblogs.com/mahuanpeng/p/6380101.html
Copyright © 2020-2023  润新知