您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
77 行
2.0 KiB
77 行
2.0 KiB
using System;
|
|
using System.Net;
|
|
|
|
public struct NetworkDataEncoder
|
|
{
|
|
byte[] m_Buffer;
|
|
|
|
int m_Offset;
|
|
|
|
public NetworkDataEncoder(byte[] buffer)
|
|
{
|
|
if (buffer == null)
|
|
throw new ArgumentNullException(nameof(buffer));
|
|
|
|
m_Buffer = buffer;
|
|
m_Offset = 0;
|
|
}
|
|
|
|
public int length => m_Offset;
|
|
|
|
public unsafe void Encode(float value) => Encode(*(int*)&value);
|
|
|
|
public unsafe void Encode(double value) => Encode(*(long*)&value);
|
|
|
|
public void Encode(ushort value) => Encode((short)value);
|
|
|
|
public void Encode(uint value) => Encode((int)value);
|
|
|
|
public void Encode(ulong value) => Encode((long)value);
|
|
|
|
public void Encode(byte value)
|
|
{
|
|
if (m_Offset + 1 > m_Buffer.Length)
|
|
throw new InvalidOperationException("Buffer is full. Cannot write more data.");
|
|
|
|
m_Buffer[m_Offset++] = value;
|
|
}
|
|
|
|
public unsafe void Encode(short value)
|
|
{
|
|
int newOffset = m_Offset + 2;
|
|
if (newOffset > m_Buffer.Length)
|
|
throw new InvalidOperationException("Buffer is full. Cannot write more data.");
|
|
|
|
fixed(byte* ptr = &m_Buffer[m_Offset])
|
|
{
|
|
*(short*)ptr = IPAddress.HostToNetworkOrder(value);
|
|
}
|
|
m_Offset = newOffset;
|
|
}
|
|
|
|
public unsafe void Encode(int value)
|
|
{
|
|
int newOffset = m_Offset + 4;
|
|
if (newOffset > m_Buffer.Length)
|
|
throw new InvalidOperationException("Buffer is full. Cannot write more data.");
|
|
|
|
fixed(byte* ptr = &m_Buffer[m_Offset])
|
|
{
|
|
*(int*)ptr = IPAddress.HostToNetworkOrder(value);
|
|
}
|
|
m_Offset = newOffset;
|
|
}
|
|
|
|
public unsafe void Encode(long value)
|
|
{
|
|
int newOffset = m_Offset + 8;
|
|
if (newOffset > m_Buffer.Length)
|
|
throw new InvalidOperationException("Buffer is full. Cannot write more data.");
|
|
|
|
fixed(byte* ptr = &m_Buffer[m_Offset])
|
|
{
|
|
*(long*)ptr = IPAddress.HostToNetworkOrder(value);
|
|
}
|
|
m_Offset = newOffset;
|
|
}
|
|
}
|