chore: initial project import
This commit is contained in:
commit
26620707a0
347 files changed
+56172
No files matched your search
@@ -0,0 +1,66 @@
|
||||
using System.Buffers.Binary;
|
||||
|
||||
namespace Fleet.Core;
|
||||
|
||||
/// <summary>LEB128 变长整数(无符号),以及 zigzag 有符号映射。</summary>
|
||||
public static class VarInt
|
||||
{
|
||||
public const int MaxBytes = 10;
|
||||
|
||||
public static ulong ZigZag(long value) => (ulong)((value << 1) ^ (value >> 63));
|
||||
|
||||
public static long UnZigZag(ulong value) => (long)(value >> 1) ^ -(long)(value & 1);
|
||||
|
||||
public static int Write(Span<byte> destination, ulong value)
|
||||
{
|
||||
int i = 0;
|
||||
while (value >= 0x80)
|
||||
{
|
||||
destination[i++] = (byte)(value | 0x80);
|
||||
value >>= 7;
|
||||
}
|
||||
|
||||
destination[i++] = (byte)value;
|
||||
return i;
|
||||
}
|
||||
|
||||
public static void Write(Stream destination, ulong value)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[MaxBytes];
|
||||
int n = Write(buffer, value);
|
||||
destination.Write(buffer[..n]);
|
||||
}
|
||||
|
||||
/// <summary>读取失败(数据被截断或超过 10 字节)时返回 false。</summary>
|
||||
public static bool TryRead(ReadOnlySpan<byte> source, out ulong value, out int consumed)
|
||||
{
|
||||
value = 0;
|
||||
consumed = 0;
|
||||
int shift = 0;
|
||||
while (consumed < source.Length && consumed < MaxBytes)
|
||||
{
|
||||
byte b = source[consumed++];
|
||||
value |= (ulong)(b & 0x7F) << shift;
|
||||
if ((b & 0x80) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
shift += 7;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool TryReadUInt32LittleEndian(ReadOnlySpan<byte> source, out uint value)
|
||||
{
|
||||
if (source.Length < 4)
|
||||
{
|
||||
value = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
value = BinaryPrimitives.ReadUInt32LittleEndian(source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user