MemoryStream
内存数据的读写
电脑中最基本的单位是位(
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文档返回给用户进行下载。