字节、流与数据读写

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)
    {

    }

    /// 
    /// 从流中读取一个int数据
    /// 
    /// 
    public int ReadInt()
    {
        byte[] arr = new byte[4];
        base.Read(arr, 0, 4);   // 存到arr中
        return BitConverter.ToInt32(arr, 0);
    }
    /// 
    /// 把一个int数据写入流
    /// 
    /// 
    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;
}

你可能感兴趣的:(C#,数据结构)