You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.8 KiB
C#
121 lines
3.8 KiB
C#
2 months ago
|
#if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA
|
||
|
using System.Runtime.InteropServices;
|
||
|
|
||
|
namespace FlyingWormConsole3.LiteNetLib.Utils
|
||
|
{
|
||
|
public static class FastBitConverter
|
||
|
{
|
||
|
[StructLayout(LayoutKind.Explicit)]
|
||
|
private struct ConverterHelperDouble
|
||
|
{
|
||
|
[FieldOffset(0)]
|
||
|
public ulong Along;
|
||
|
|
||
|
[FieldOffset(0)]
|
||
|
public double Adouble;
|
||
|
}
|
||
|
|
||
|
[StructLayout(LayoutKind.Explicit)]
|
||
|
private struct ConverterHelperFloat
|
||
|
{
|
||
|
[FieldOffset(0)]
|
||
|
public int Aint;
|
||
|
|
||
|
[FieldOffset(0)]
|
||
|
public float Afloat;
|
||
|
}
|
||
|
|
||
|
private static void WriteLittleEndian(byte[] buffer, int offset, ulong data)
|
||
|
{
|
||
|
#if BIGENDIAN
|
||
|
buffer[offset + 7] = (byte)(data);
|
||
|
buffer[offset + 6] = (byte)(data >> 8);
|
||
|
buffer[offset + 5] = (byte)(data >> 16);
|
||
|
buffer[offset + 4] = (byte)(data >> 24);
|
||
|
buffer[offset + 3] = (byte)(data >> 32);
|
||
|
buffer[offset + 2] = (byte)(data >> 40);
|
||
|
buffer[offset + 1] = (byte)(data >> 48);
|
||
|
buffer[offset ] = (byte)(data >> 56);
|
||
|
#else
|
||
|
buffer[offset] = (byte)(data);
|
||
|
buffer[offset + 1] = (byte)(data >> 8);
|
||
|
buffer[offset + 2] = (byte)(data >> 16);
|
||
|
buffer[offset + 3] = (byte)(data >> 24);
|
||
|
buffer[offset + 4] = (byte)(data >> 32);
|
||
|
buffer[offset + 5] = (byte)(data >> 40);
|
||
|
buffer[offset + 6] = (byte)(data >> 48);
|
||
|
buffer[offset + 7] = (byte)(data >> 56);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
private static void WriteLittleEndian(byte[] buffer, int offset, int data)
|
||
|
{
|
||
|
#if BIGENDIAN
|
||
|
buffer[offset + 3] = (byte)(data);
|
||
|
buffer[offset + 2] = (byte)(data >> 8);
|
||
|
buffer[offset + 1] = (byte)(data >> 16);
|
||
|
buffer[offset ] = (byte)(data >> 24);
|
||
|
#else
|
||
|
buffer[offset] = (byte)(data);
|
||
|
buffer[offset + 1] = (byte)(data >> 8);
|
||
|
buffer[offset + 2] = (byte)(data >> 16);
|
||
|
buffer[offset + 3] = (byte)(data >> 24);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
public static void WriteLittleEndian(byte[] buffer, int offset, short data)
|
||
|
{
|
||
|
#if BIGENDIAN
|
||
|
buffer[offset + 1] = (byte)(data);
|
||
|
buffer[offset ] = (byte)(data >> 8);
|
||
|
#else
|
||
|
buffer[offset] = (byte)(data);
|
||
|
buffer[offset + 1] = (byte)(data >> 8);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, double value)
|
||
|
{
|
||
|
ConverterHelperDouble ch = new ConverterHelperDouble { Adouble = value };
|
||
|
WriteLittleEndian(bytes, startIndex, ch.Along);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, float value)
|
||
|
{
|
||
|
ConverterHelperFloat ch = new ConverterHelperFloat { Afloat = value };
|
||
|
WriteLittleEndian(bytes, startIndex, ch.Aint);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, short value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, value);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, ushort value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, (short)value);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, int value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, value);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, uint value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, (int)value);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, long value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, (ulong)value);
|
||
|
}
|
||
|
|
||
|
public static void GetBytes(byte[] bytes, int startIndex, ulong value)
|
||
|
{
|
||
|
WriteLittleEndian(bytes, startIndex, value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|