电脑中最基本的单位是位( bit ) , 但位这个单位太小,所以字节 (Byte) 是电脑存储容量的基本计量单位。 Byte 可简写为 B ,一个字节右八个二进制组成,其最小值为 0 ,最大值为 11111111 ,一个存储单元能存储一个字节的内容。
基本的数据类型: byte 、 short ( 2 个字节) 、 int ( 4 个字节)、 long ( 8 个字节)、 float ( 4 个字节)、 double(个字节)、bool(1个字节)、string(若char则占1个字节,若汉字则占2个字节,视情况而定)。
内存读写原理:
往内存中写东西实际上,是把相应的数据类型转换成 byte类型存到电脑上,从内存中读东西实际上是从把byte类型再转换为相应的类型。
C#本身在有个内存读写的类,叫MemoryStream。小规模的数据类型转换还好,但是数据类型变多使用起来就不太方便了。为了在项目中方便使用,我把基本数据类型和byte之间的相互转换封装成了一个类 MMOMemoryStream 。如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using System.Text;
/// <summary>
/// 数据转换( byte short int long float double bool string)
/// </summary>
public class MMOMemoryStream : MemoryStream
public MMOMemoryStream()
public MMOMemoryStream( byte [] buffer): base (buffer)
#region Short
/// <summary>
/// 从流中读取一个 short数据
/// </summary>
/// <returns></returns>
public short ReadShort()
byte [] arr = new byte [2];
base .Read(arr, 0, 2);
return BitConverter .ToInt16(arr, 0);
/// <summary>
/// 把一个 short数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteShort( short value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region UShort
/// <summary>
/// 从流中读取一个 ushort数据
/// </summary>
/// <returns></returns>
public ushort ReadUShort()
byte [] arr = new byte [2];
base .Read(arr, 0, 2);
return BitConverter .ToUInt16(arr, 0);
/// <summary>
/// 把一个 ushort数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteUShort( ushort value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region Int
/// <summary>
/// 从流中读取一个 int数据
/// </summary>
/// <returns></returns>
public int ReadInt()
byte [] arr = new byte [4];
base .Read(arr, 0, 4);
return BitConverter .ToInt32(arr,0);
/// <summary>
/// 把一个 int数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteInt( int value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region UInt
/// <summary>
/// 从流中读取一个 uint数据
/// </summary>
/// <returns></returns>
public uint ReadUInt()
byte [] arr = new byte [4];
base .Read(arr, 0, 4);
return BitConverter .ToUInt32(arr, 0);
/// <summary>
/// 把一个 uint数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteUInt( uint value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region Long
/// <summary>
/// 从流中读取一个 long数据
/// </summary>
/// <returns></returns>
public long ReadLong()
byte [] arr = new byte [8];
base .Read(arr, 0, 8);
return BitConverter .ToInt64(arr, 0);
/// <summary>
/// 把一个 long数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteLong( long value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region ULong
/// <summary>
/// 从流中读取一个 ulong数据
/// </summary>
/// <returns></returns>
public ulong ReadULong()
byte [] arr = new byte [8];
base .Read(arr, 0, 8);
return BitConverter .ToUInt64(arr, 0);
/// <summary>
/// 把一个 ulong数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteULong( ulong value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region Float
/// <summary>
/// 从流中读取一个 float数据
/// </summary>
/// <returns></returns>
public float ReadFloat()
byte [] arr = new byte [4];
base .Read(arr, 0, 4);
return BitConverter .ToSingle(arr, 0);
/// <summary>
/// 把一个 float数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteFloat( float value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.Length);
#endregion
#region Double
/// <summary>
/// 从流中读取一个 double数据
/// </summary>
/// <returns></returns>
public double ReadDouble()
byte [] arr = new byte [8];
base .Read(arr, 0, 8);
return BitConverter .ToDouble(arr, 0);
/// <summary>
/// 把一个 double数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteDouble( double value)
byte [] arr = BitConverter .GetBytes(value);
base .Write(arr, 0, arr.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 = this .ReadUShort();
byte [] arr = new byte [len];
base .Read(arr, 0, len);
return Encoding .UTF8.GetString(arr);
/// <summary>
/// 把一个 string数据写入流
/// </summary>
/// <param name=" value "></param>
public void WriteUTF8String( string str)
byte [] arr = Encoding .UTF8.GetBytes(str);
if (arr.Length>65535)
throw new InvalidCastException ( "字符串超出范围" );
this .WriteUShort(( ushort )arr.Length);
base .Write(arr, 0, arr.Length);
#endregion
下面是我写的测试脚本,把类里面的数据写到内存,再从内存里读取出来。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Role
public int id;
public string name;
public class TestMMOMemoryStream : MonoBehaviour {
private void Start ()
#region 写的操作
Role role = new Role () { id = 1, name = "笔圣" };
byte [] arr = null ;
using ( MMOMemoryStream ms = new MMOMemoryStream ())
ms.WriteInt(role.id);
ms.WriteUTF8String(role.name);
arr = ms.ToArray();
//if (arr != null)
// for (int i = 0; i < arr.Length; i++)
// {
// Debug.Log(string.Format("arr{0}={1}", i, arr[i]));
// }
#endregion
#region 读的操作
Role role1 = new Role ();
using ( MMOMemoryStream ms = new MMOMemoryStream (arr))
role1.id = ms.ReadInt();
role1.name = ms.ReadUTF8String();
Debug .Log( string .Format( "role1.id={0},role1.name={1}" , role1.id, role1.name));
#endregion
写的结果如下图:
读的结果如下图:
MemoryStream内存数据的读写 电脑中最基本的单位是位(bit),但位这个单位太小,所以字节(Byte)是电脑存储容量的基本计量单位。Byte可简写为B,一个字节右八个二进制组成,其最小值为0,最大值为11111111,一个存储单元能存储一个字节的内容。 基本的数据类型:byte 、short(2个字节) 、int(4个字节)、long(8个字节)、float(4个 1. 首先,在项目中安装EPPlus包。 2. 然后,创建一个控制器处理导出 数据 。在控制器中,可以使用Entity Framework或其他ORM库从 数据 库中检索所需 数据 。 3. 接下来,使用EPPlus创建一个新的Excel文档,并创建一个工作表。 4. 再然后,将从 数据 库中检索到的 数据 填充到工作表中。使用适当的 数据 类型格式化单元格。 5. 最后,将Excel文档保存到服务器上的某个位置,然后将其提供给用户进行下载。 下面是一个示例控制器代码: public ActionResult ExportToExcel() var dataList = dbContext.MyTable.ToList(); var excelPackage = new ExcelPackage(); var worksheet = excelPackage.Workbook.Worksheets.Add("My Data"); worksheet.Cells[1, 1].Value = "Column 1"; worksheet.Cells[1, 2].Value = "Column 2"; worksheet.Cells[1, 3].Value = "Column 3"; int rowIndex = 2; foreach (var dataItem in dataList) worksheet.Cells[rowIndex, 1].Value = dataItem.Column1; worksheet.Cells[rowIndex, 2].Value = dataItem.Column2; worksheet.Cells[rowIndex, 3].Value = dataItem.Column3; rowIndex++; var memory Stream = new Memory Stream (); excelPackage.SaveAs( memory Stream ); memory Stream .Position = 0; return File( memory Stream , "application/vnd.openxmlformats-officedocument.sp read sheetml.sheet", "MyData.xlsx"); 这个示例将从名为"MyTable"的表中检索 数据 ,并将它们填充到一个名为"My Data"的Excel工作表中。最后,它将Excel文档返回给用户进行下载。