封裝位元組流(byte[])操作類 c#
在網路通訊中,資料在網路傳輸的格式必須以位元組流的形式進行,因此需要我們對位元組流進行寫入和讀出的操作,下面將會封裝兩個類,用來將各種型別的資料寫入位元組流,和從位元組流中讀取各種型別的資料。如下讀取類:NetBufferReaderusing System; using System.IO; using System.Text;
namespace Tool { class NetBufferReader {
MemoryStream m_stream = null; BinaryReader m_reader = null;
ushort m_dataLength;
public NetBufferReader(byte[] data) { if(data != null) { m_stream = new MemoryStream(data); m_reader = new BinaryReader(m_stream);
m_dataLength = ReadUShort(); } }
public byte ReadByte() { return m_reader.ReadByte(); }
public int ReadInt() { return m_reader.ReadInt32(); }
public uint ReadUInt() { return m_reader.ReadUInt32(); }
public short ReadShort() { return m_reader.ReadInt16(); }
public ushort ReadUShort() { return m_reader.ReadUInt16(); }
public long ReadLong() { return m_reader.ReadInt64(); }
public ulong ReadULong() { return m_reader.ReadUInt64(); }
public float ReadFloat() { byte[] temp = BitConverter.GetBytes(m_reader.ReadSingle()); Array.Reverse(temp); return BitConverter.ToSingle(temp, 0); }
public double ReadDouble() { byte[] temp = BitConverter.GetBytes(m_reader.ReadDouble()); Array.Reverse(temp); return BitConverter.ToDouble(temp, 0); }
public string ReadString() { ushort len = ReadUShort(); byte[] buffer = new byte[len]; buffer = m_reader.ReadBytes(len); return Encoding.UTF8.GetString(buffer); }
public byte[] ReadBytes() { int len = ReadInt(); return m_reader.ReadBytes(len); }
public void Close() { if(m_reader != null) { m_reader.Close(); } if(m_stream != null) { m_stream.Close(); } m_reader = null; m_stream = null; } } }寫入類:NetBufferWriterusing System; using System.IO; using System.Text;
namespace Tool { class NetBufferWriter { MemoryStream m_stream = null; BinaryWriter m_writer = null;
int m_finishLength; public int finishLength { get { return m_finishLength; } }
public NetBufferWriter() { m_finishLength = 0; m_stream = new MemoryStream(); m_writer = new BinaryWriter(m_stream); }
public void WriteByte(byte v) { m_writer.Write(v); }
public void WriteInt(int v) { m_writer.Write(v); }
public void WriteUInt(uint v) { m_writer.Write(v); }
public void WriteShort(short v) { m_writer.Write(v); }
public void WriteUShort(ushort v) { m_writer.Write(v); }
public void WriteLong(long v) { m_writer.Write(v); }
public void WriteULong(ulong v) { m_writer.Write(v); }
public void WriteFloat(float v) { byte[] temp = BitConverter.GetBytes(v); Array.Reverse(temp); m_writer.Write(BitConverter.ToSingle(temp, 0)); }
public void WriteDouble(double v) { byte[] temp = BitConverter.GetBytes(v); Array.Reverse(temp); m_writer.Write(BitConverter.ToDouble(temp, 0)); }
public void WriteString(string v) { byte[] bytes = Encoding.UTF8.GetBytes(v); m_writer.Write((ushort)bytes.Length); m_writer.Write(bytes); }
public void WriteBytes(byte[] v) { m_writer.Write(v.Length); m_writer.Write(v); }
public byte[] ToBytes() { m_writer.Flush(); return m_stream.ToArray(); }
public void Close() { m_writer.Close(); m_stream.Close(); m_writer = null; m_stream = null; }
/// <summary> /// 將已寫入的資料流,封裝成一個新的資料流(現有資料長度+現有資料) /// 資料轉換,網路傳送需要兩部分資料,一是資料長度,二是主體資料 /// </summary> public byte[] Finish() { byte[] message = ToBytes(); MemoryStream ms = new MemoryStream(); ms.Position = 0; BinaryWriter writer = new BinaryWriter(ms); writer.Write((ushort)message.Length); writer.Write(message); writer.Flush(); byte[] result = ms.ToArray(); m_finishLength = result.Length; return result; } } }
---------------------
本文來自 王王王渣渣 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wangjiangrong/article/details/80844392?utm_source=copy