zoukankan      html  css  js  c++  java
  • 独立项目-MemoryStream-内存数据读写-01

    学习内容:

      1.内存读写原理,字节的转换。

      2.编写自己的内存读写类,这个类是项目中比较核心的类。

        注:电脑中最基本的单位是“位”(bit),但是“位”(bit)这个单位太小,所以字节(Byte)是电脑存储容量的基本计量单位。Byte可简写成位B,一个字节由8个二进制位组成,其最小值位0,最大值为11111111,一个存储单元能存储一个字节的内容。

      一、int转换为byte 与 byte转换为int示例:

    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             Test_MMOMemory.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-04-04 18:19:14
    // 修改者列表(modifier):
    // 模块描述(Module description):
    // 
    // **********************************************************************
    #endregion
    
    using System;
    using UnityEngine;
    
    public class Test_MMOMemory : MonoBehaviour 
    {
        private void Start()
        {
            IntToByte();
            ByteToInt();
        }
    
        /// <summary>
        /// 把int转换成byte数据
        /// </summary>
        private void IntToByte()
        {//int 4个字节(4个byte)
            int a = 10;
    
            //把int转换成byte数据
            byte[] array1 = BitConverter.GetBytes(a);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array1.Length; ++i)
            {
                Debug.Log(string.Format("array1{0} = {1}", i, array1[i]));
            }
    
            //int 4个字节(4个byte)
            int b = 98;
    
            //把int转换成byte数据
            byte[] array2 = BitConverter.GetBytes(b);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array2.Length; ++i)
            {
                Debug.Log(string.Format("array2{0} = {1}", i, array2[i]));
            }
    
            //int 4个字节(4个byte)
            int c = 8998;
    
            //把int转换成byte数据
            byte[] array3 = BitConverter.GetBytes(c);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array3.Length; ++i)
            {
                Debug.Log(string.Format("array3{0} = {1}", i, array3[i]));
            }
        }
    
        private void ByteToInt()
        {
            byte[] array = new byte[4];
            array[0] = 86;
            array[1] = 128;
            array[2] = 224;
            array[3] = 5;
    
            int a = BitConverter.ToInt32(array, 0);
            Debug.Log(string.Format("a = {0}", a));
        }
    }

      二、如何写自己的MMO_MemoryStream脚本:

    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             MMO_MemoryStream.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-04-04 18:39:06
    // 修改者列表(modifier):
    // 模块描述(Module description):
    // 
    // **********************************************************************
    #endregion
    
    using System;
    using System.IO;
    using System.Text;
    using UnityEngine;
    
    /// <summary>
    /// 数据转换(byte、short、int、long、float、decimal、bool、string)
    /// </summary>
    public class MMO_MemoryStream : MemoryStream 
    {
        /// <summary>
        /// 构造函数 传递给基类
        /// </summary>
        /// <param name="buffer"></param>
        public MMO_MemoryStream(byte[] buffer):base(buffer)
        {
        }
    
        /// <summary>
        /// 构造函数
        /// </summary>
        public MMO_MemoryStream() : base()
        {
    
        }
    
        #region short相关
    
        /// <summary>
        /// 从流中读取一个short数据
        /// </summary>
        /// <returns></returns>
        public short ReadShort()
        {
            byte[] array = new byte[2];
            base.Read(array, 0, 2);
    
            return BitConverter.ToInt16(array, 0);
        }
    
        /// <summary>
        /// 把一个short数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteShort(short _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region ushort相关
    
        /// <summary>
        /// 从流中读取一个ushort数据
        /// </summary>
        /// <returns></returns>
        public ushort ReadUShort()
        {
            byte[] array = new byte[2];
            base.Read(array, 0, 2);
    
            return BitConverter.ToUInt16(array, 0);
        }
    
        /// <summary>
        /// 把一个ushort数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteUShort(ushort _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region int相关
    
        /// <summary>
        /// 从流中读取一个int数据
        /// </summary>
        /// <returns></returns>
        public int ReadInt()
        {
            byte[] array = new byte[4];
            base.Read(array, 0, 4);
    
            return BitConverter.ToInt32(array, 0);
        }
    
        /// <summary>
        /// 把一个int数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteInt(int _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region uint相关
    
        /// <summary>
        /// 从流中读取一个uint数据
        /// </summary>
        /// <returns></returns>
        public uint ReadUInt()
        {
            byte[] array = new byte[4];
            base.Read(array, 0, 4);
    
            return BitConverter.ToUInt32(array, 0);
        }
    
        /// <summary>
        /// 把一个uint数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteUInt(uint _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region long相关
    
        /// <summary>
        /// 从流中读取一个long数据
        /// </summary>
        /// <returns></returns>
        public long ReadLong()
        {
            byte[] array = new byte[8];
            base.Read(array, 0, 8);
    
            return BitConverter.ToInt64(array, 0);
        }
    
        /// <summary>
        /// 把一个long数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteLong(long _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region ulong相关
    
        /// <summary>
        /// 从流中读取一个ulong数据
        /// </summary>
        /// <returns></returns>
        public ulong ReadULong()
        {
            byte[] array = new byte[8];
            base.Read(array, 0, 8);
    
            return BitConverter.ToUInt64(array, 0);
        }
    
        /// <summary>
        /// 把一个ulong数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteULong(ulong _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region float相关
    
        /// <summary>
        /// 从流中读取一个float数据
        /// </summary>
        /// <returns></returns>
        public float ReadFloat()
        {
            byte[] array = new byte[4];
            base.Read(array, 0, 4);
    
            return BitConverter.ToSingle(array, 0);
        }
    
        /// <summary>
        /// 把一个float数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteFloat(float _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region double相关
    
        /// <summary>
        /// 从流中读取一个double数据
        /// </summary>
        /// <returns></returns>
        public double ReadDouble()
        {
            byte[] array = new byte[8];
            base.Read(array, 0, 8);
    
            return BitConverter.ToDouble(array, 0);
        }
    
        /// <summary>
        /// 把一个double数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteDouble (double _value)
        {
            byte[] array = BitConverter.GetBytes(_value);
            base.Write(array, 0, array.Length);
        }
    
        #endregion
    
        #region bool相关
    
        /// <summary>
        /// 从流中读取一个bool数据
        /// </summary>
        /// <returns></returns>
        public bool ReadBool()
        {
            return base.ReadByte() == 1;
        }
    
        /// <summary>
        /// 把一个bool数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteBool(bool _value)
        {
            base.WriteByte((byte)(_value == true ? 1 : 0));
        }
    
        #endregion
    
        #region UTF8String相关
        /// <summary>
        /// 从流中读取一个string数据
        /// </summary>
        /// <returns></returns>
        public string ReadUTF8String()
        {
            ushort len = ReadUShort();
            byte[] array = new byte[len];
            base.Read(array, 0, len);
    
            return Encoding.UTF8.GetString(array);
        }
    
        /// <summary>
        /// 把一个string数据写入流
        /// </summary>
        /// <param name="_value"></param>
        public void WriteUTF8String(string _value)
        {
            byte[] array = Encoding.UTF8.GetBytes(_value);
    
            if (array.Length > 65535)
            {
                throw new InvalidCastException("字符串超出范围");
            }
    
            //先写入字符串的长度
            WriteUShort((ushort)array.Length);
    
            //再将字符串写入
            base.Write(array, 0, array.Length);
        }
        #endregion
    }

      三、在 Test_MMOMemory.cs 脚本中测试 MMO_MemoryStream.cs 脚本

    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             Test_MMOMemory.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-04-04 18:19:14
    // 修改者列表(modifier):
    // 模块描述(Module description):
    // 
    // **********************************************************************
    #endregion
    
    using System;
    using UnityEngine;
    
    public class Item
    {
        public int ID;
        public string Name;
    }
    
    public class Test_MMOMemory : MonoBehaviour 
    {
        private void Start()
        {
            Item item = new Item() { ID = 1874, Name = "Dean1993"};
    
            byte[] array = null;
    
            //using自动释放
            using (MMO_MemoryStream ms = new MMO_MemoryStream())
            {
                //写入流
                ms.WriteInt(item.ID);
                ms.WriteUTF8String(item.Name);
    
                array = ms.ToArray();
            }
    
            if (array != null)
            {
                for (int i = 0; i < array.Length; ++i)
                {
                    Debug.Log(string.Format("{0} = {1}", i, array[i]));
                }
            }
    
            Item item2 = new Item();
            using (MMO_MemoryStream ms = new MMO_MemoryStream(array))
            {
                item2.ID = ms.ReadInt();
                item2.Name = ms.ReadUTF8String();
            }
    
            Debug.Log(string.Format("item2 ID = {0}", item2.ID));
            Debug.Log(string.Format("item2 Name = {0}", item2.Name));
        }
    
        /// <summary>
        /// 把int转换成byte数据
        /// </summary>
        private void IntToByte()
        {//int 4个字节(4个byte)
            int a = 10;
    
            //把int转换成byte数据
            byte[] array1 = BitConverter.GetBytes(a);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array1.Length; ++i)
            {
                Debug.Log(string.Format("array1{0} = {1}", i, array1[i]));
            }
    
            //int 4个字节(4个byte)
            int b = 98;
    
            //把int转换成byte数据
            byte[] array2 = BitConverter.GetBytes(b);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array2.Length; ++i)
            {
                Debug.Log(string.Format("array2{0} = {1}", i, array2[i]));
            }
    
            //int 4个字节(4个byte)
            int c = 8998;
    
            //把int转换成byte数据
            byte[] array3 = BitConverter.GetBytes(c);
    
            //提示:循环尽量用for,少用foreach
            for (int i = 0; i < array3.Length; ++i)
            {
                Debug.Log(string.Format("array3{0} = {1}", i, array3[i]));
            }
        }
    
        private void ByteToInt()
        {
            byte[] array = new byte[4];
            array[0] = 86;
            array[1] = 128;
            array[2] = 224;
            array[3] = 5;
    
            int a = BitConverter.ToInt32(array, 0);
            Debug.Log(string.Format("a = {0}", a));
        }
    }
  • 相关阅读:
    关键性点位
    【转】Chrome——F12 谷歌开发者工具详解
    LPR-贷款市场报价利率
    盘口-挂单
    看盘
    复盘
    2020超星尔雅后台挂课工具(完全免费)
    Codeup 问题 D: String Subtraction (20)
    维瓦尔第协奏曲《四季》赏析 (Antonio Vavildi 《The Four Seasons》)
    算法4-5:求子串位置的定位函数
  • 原文地址:https://www.cnblogs.com/Dean27/p/8718952.html
Copyright © 2011-2022 走看看