1字节=8位,1个字节(Byte)即8个二进制位(bit)
B与bit
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位
整形转字节数组
// 整形转字节数组
// 整形4个字节
int a = 500;
byte[] arr = BitConverter.GetBytes(a); // 整形转字节数组
for (int i = 0; i < arr.Length; i++)
{
Debug.Log(string.Format("arr{0}:{1}", i, arr[i]));
}
// 输出:arr0:244 arr1:1 arr2:0 arr3:0
字节数组转整形
// 字节数组转整形
byte[] arr2 = new byte[4];
arr2[0] = 244;
arr2[1] = 1;
arr2[2] = 0;
arr2[3] = 0;
int b = BitConverter.ToInt32(arr2, 0);
Debug.Log(string.Format("b={0}", b));
// 输出:b=500
内存数据读写类:
public class MMO_MemoryStream : MemoryStream
{
public MMO_MemoryStream() : base()
{
}
public MMO_MemoryStream(byte[] buffer) : base(buffer)
{
}
/// <summary>
/// 从流中读取一个int数据
/// </summary>
/// <returns></returns>
public int ReadInt()
{
byte[] arr = new byte[4];
base.Read(arr, 0, 4); // 存到arr中
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, 4);
}
public bool ReadBool()
{
return base.ReadByte() == 1;
}
public void WriteBool(bool value)
{
base.WriteByte((byte)(value == true ? 1 : 0));
}
public String ReadUTF8String()
{
ushort len = ReadUShort(); // string类型,先读取string的长度,再读取值
byte[] arrValue = new byte[len];
base.Read(arrValue, 0, len);
return Encoding.UTF8.GetString(arrValue); // 注意:string的读写和其他类型不同,需要编码格式
}
public void WriteUTF8String(string value)
{
byte[] arr = Encoding.UTF8.GetBytes(value);
if(arr.Length > 65535)
{
throw new InvalidCastException("字符串超出范围65535");
}
WriteUShort((ushort)arr.Length);
base.Write(arr, 0, arr.Length);
}
public ushort ReadUShort()
{
byte[] arr = new byte[2];
base.Read(arr, 0, 2);
return BitConverter.ToUInt16(arr, 0);
}
public void WriteUShort(ushort value)
{
byte[] arr = BitConverter.GetBytes(value);
base.Write(arr, 0, 2);
}
}
测试写入与读取代码:
void Start()
{
Item item = new Item();
item.Id = 1;
item.isShow = true;
item.Name = "名字";
byte[] arr;
using (MMO_MemoryStream ms = new MMO_MemoryStream())
{
ms.WriteInt(item.Id);
ms.WriteBool(item.isShow);
ms.WriteUTF8String(item.Name);
arr = ms.ToArray(); // 流可以直接转为字节数组
}
Item item2 = new Item();
using (MMO_MemoryStream ms = new MMO_MemoryStream(arr))
{
item2.Id = ms.ReadInt();
item2.isShow = ms.ReadBool();
item2.Name = ms.ReadUTF8String();
}
Debug.Log(string.Format("item2.Id={0}", item2.Id));
Debug.Log(string.Format("item2.isShow={0}", item2.isShow));
Debug.Log(string.Format("item2.Name={0}", item2.Name));
}
class Item
{
public int Id;
public bool isShow;
public string Name;
}