#if (!UNITY_WEBGL || UNITY_EDITOR) && !BESTHTTP_DISABLE_ALTERNATE_SSL && !BESTHTTP_DISABLE_HTTP2
using System;
namespace BestHTTP.Connections.HTTP2
{
public static class BufferHelper
{
public static void SetUInt16(byte[] buffer, int offset, UInt16 value)
{
buffer[offset + 1] = (byte)(value);
buffer[offset + 0] = (byte)(value >> 8);
}
public static void SetUInt24(byte[] buffer, int offset, UInt32 value)
{
buffer[offset + 2] = (byte)(value);
buffer[offset + 1] = (byte)(value >> 8);
buffer[offset + 0] = (byte)(value >> 16);
}
public static void SetUInt31(byte[] buffer, int offset, UInt32 value)
{
buffer[offset + 3] = (byte)(value);
buffer[offset + 2] = (byte)(value >> 8);
buffer[offset + 1] = (byte)(value >> 16);
buffer[offset + 0] = (byte)((value >> 24) & 0x7F);
}
public static void SetUInt32(byte[] buffer, int offset, UInt32 value)
{
buffer[offset + 3] = (byte)(value);
buffer[offset + 2] = (byte)(value >> 8);
buffer[offset + 1] = (byte)(value >> 16);
buffer[offset + 0] = (byte)(value >> 24);
}
public static void SetLong(byte[] buffer, int offset, long value)
{
buffer[offset + 7] = (byte)(value);
buffer[offset + 6] = (byte)(value >> 8);
buffer[offset + 5] = (byte)(value >> 16);
buffer[offset + 4] = (byte)(value >> 24);
buffer[offset + 3] = (byte)(value >> 32);
buffer[offset + 2] = (byte)(value >> 40);
buffer[offset + 1] = (byte)(value >> 48);
buffer[offset + 0] = (byte)(value >> 56);
}
///
/// bitIdx: 01234567
///
public static byte SetBit(byte value, byte bitIdx, bool bitValue)
{
return SetBit(value, bitIdx, Convert.ToByte(bitValue));
}
///
/// bitIdx: 01234567
///
public static byte SetBit(byte value, byte bitIdx, byte bitValue)
{
//byte mask = (byte)(0x80 >> bitIdx);
return (byte)((value ^ (value & (0x80 >> bitIdx))) | bitValue << (7 - bitIdx));
}
///
/// bitIdx: 01234567
///
public static byte ReadBit(byte value, byte bitIdx)
{
byte mask = (byte)(0x80 >> bitIdx);
return (byte)((value & mask) >> (7 - bitIdx));
}
///
/// bitIdx: 01234567
///
public static byte ReadValue(byte value, byte fromBit, byte toBit)
{
byte result = 0;
short idx = toBit;
while (idx >= fromBit)
{
result += (byte)(ReadBit(value, (byte)idx) << (toBit - idx));
idx--;
}
return result;
}
public static UInt16 ReadUInt16(byte[] buffer, int offset)
{
return (UInt16)(buffer[offset + 1] | buffer[offset] << 8);
}
public static UInt32 ReadUInt24(byte[] buffer, int offset)
{
return (UInt32)(buffer[offset + 2] |
buffer[offset + 1] << 8 |
buffer[offset + 0] << 16
);
}
public static UInt32 ReadUInt31(byte[] buffer, int offset)
{
return (UInt32)(buffer[offset + 3] |
buffer[offset + 2] << 8 |
buffer[offset + 1] << 16 |
(buffer[offset] & 0x7F) << 24
);
}
public static UInt32 ReadUInt32(byte[] buffer, int offset)
{
return (UInt32)(buffer[offset + 3] |
buffer[offset + 2] << 8 |
buffer[offset + 1] << 16 |
buffer[offset + 0] << 24
);
}
public static long ReadLong(byte[] buffer, int offset)
{
return (long)buffer[offset + 7] |
(long)buffer[offset + 6] << 8 |
(long)buffer[offset + 5] << 16 |
(long)buffer[offset + 4] << 24 |
(long)buffer[offset + 3] << 32 |
(long)buffer[offset + 2] << 40 |
(long)buffer[offset + 1] << 48 |
(long)buffer[offset + 0] << 56;
}
}
}
#endif