Merge branch 'master' of http://172.20.20.19:3000/ft/skyscraper8
Some checks are pending
🚀 Pack skyscraper8 / make-zip (push) Waiting to run
Some checks are pending
🚀 Pack skyscraper8 / make-zip (push) Waiting to run
# Conflicts: # skyscraper8/Skyscraper/IO/RemoteStreamReader/RemoteStreamReaderClient.cs
This commit is contained in:
commit
d91d58b71d
@ -1,401 +1,427 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace skyscraper5.Skyscraper.IO
|
namespace skyscraper5.Skyscraper.IO
|
||||||
{
|
{
|
||||||
public static class StreamExtensions
|
public static class StreamExtensions
|
||||||
{
|
{
|
||||||
[DebuggerStepThrough]
|
[DebuggerStepThrough]
|
||||||
public static ushort ReadUInt16BE(this Stream stream)
|
public static ushort ReadUInt16BE(this Stream stream)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[2];
|
byte[] buffer = new byte[2];
|
||||||
if (stream.Read(buffer, 0, 2) != 2)
|
if (stream.Read(buffer, 0, 2) != 2)
|
||||||
throw new EndOfStreamException();
|
throw new EndOfStreamException();
|
||||||
if (BitConverter.IsLittleEndian)
|
if (BitConverter.IsLittleEndian)
|
||||||
Array.Reverse(buffer, 0, 2);
|
Array.Reverse(buffer, 0, 2);
|
||||||
return BitConverter.ToUInt16(buffer, 0);
|
return BitConverter.ToUInt16(buffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static short ReadInt16LE(this Stream stream)
|
public static short ReadInt16LE(this Stream stream)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[2];
|
byte[] buffer = new byte[2];
|
||||||
if (stream.Read(buffer, 0, 2) != 2)
|
if (stream.Read(buffer, 0, 2) != 2)
|
||||||
throw new EndOfStreamException();
|
throw new EndOfStreamException();
|
||||||
if (!BitConverter.IsLittleEndian)
|
if (!BitConverter.IsLittleEndian)
|
||||||
Array.Reverse(buffer, 0, 2);
|
Array.Reverse(buffer, 0, 2);
|
||||||
return BitConverter.ToInt16(buffer, 0);
|
return BitConverter.ToInt16(buffer, 0);
|
||||||
}
|
|
||||||
|
|
||||||
public static ushort ReadUInt16LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[2];
|
|
||||||
if (stream.Read(buffer, 0, 2) != 2)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 2);
|
|
||||||
return BitConverter.ToUInt16(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static uint ReadUInt32BE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[4];
|
|
||||||
if (stream.Read(buffer, 0, 4) != 4)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToUInt32(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static uint ReadUInt32LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[4];
|
|
||||||
if (stream.Read(buffer, 0, 4) != 4)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToUInt32(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int ReadInt32LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[4];
|
|
||||||
if (stream.Read(buffer, 0, 4) != 4)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToInt32(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ulong ReadUInt48BE(this Stream stream)
|
|
||||||
{
|
|
||||||
ulong result = 0;
|
|
||||||
result = ReadUInt16BE(stream);
|
|
||||||
result <<= 32;
|
|
||||||
result += ReadUInt32BE(stream);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long ReadInt64LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToInt64(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ulong ReadUInt64LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToUInt64(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ulong ReadUInt64BE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 4);
|
|
||||||
return BitConverter.ToUInt64(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static byte[] ReadBytes(this Stream stream, long length)
|
|
||||||
{
|
|
||||||
if (length > Int32.MaxValue)
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
if (length == 0)
|
|
||||||
return new byte[0];
|
|
||||||
if (length < 0)
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
|
|
||||||
int length32 = (int)length;
|
|
||||||
|
|
||||||
byte[] buffer = new byte[length32];
|
|
||||||
if (stream.Read(buffer, 0, length32) != length32)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static sbyte[] ReadSBytes(this Stream stream, long length)
|
|
||||||
{
|
|
||||||
if (length > Int32.MaxValue)
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
if (length == 0)
|
|
||||||
return new sbyte[0];
|
|
||||||
if (length < 0)
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
|
|
||||||
int length32 = (int)length;
|
|
||||||
|
|
||||||
sbyte[] buffer = new sbyte[length32];
|
|
||||||
for (int i = 0; i < length32; i++)
|
|
||||||
{
|
|
||||||
buffer[i] = (sbyte)stream.ReadUInt8();
|
|
||||||
}
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static byte ReadUInt8(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[1];
|
|
||||||
if (stream.Read(buffer, 0, 1) != 1)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
|
|
||||||
return buffer[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static long GetAvailableBytes(this Stream stream)
|
|
||||||
{
|
|
||||||
if (stream is GZipStream)
|
|
||||||
{
|
|
||||||
GZipStream gzip = (GZipStream)stream;
|
|
||||||
long baseStreamPosition = gzip.BaseStream.Length - gzip.BaseStream.Position;
|
|
||||||
return baseStreamPosition;
|
|
||||||
}
|
|
||||||
return stream.Length - stream.Position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteUInt8Repeat(this Stream stream, byte uint8, int repetitions)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[repetitions];
|
|
||||||
Array.Fill(buffer, uint8);
|
|
||||||
stream.Write(buffer, 0, repetitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static uint ReadUInt24BE(this Stream stream)
|
|
||||||
{
|
|
||||||
uint result = stream.ReadUInt16BE();
|
|
||||||
result <<= 8;
|
|
||||||
result += stream.ReadUInt8();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double ReadDoubleLE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer, 0, 8);
|
|
||||||
return BitConverter.ToDouble(buffer, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double ReadDoubleBE(this Stream stream)
|
public static ushort ReadUInt16LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[2];
|
||||||
|
if (stream.Read(buffer, 0, 2) != 2)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 2);
|
||||||
|
return BitConverter.ToUInt16(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static uint ReadUInt32BE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[4];
|
||||||
|
if (stream.Read(buffer, 0, 4) != 4)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToUInt32(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static uint ReadUInt32LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[4];
|
||||||
|
if (stream.Read(buffer, 0, 4) != 4)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToUInt32(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ReadInt32LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[4];
|
||||||
|
if (stream.Read(buffer, 0, 4) != 4)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToInt32(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ulong ReadUInt48BE(this Stream stream)
|
||||||
|
{
|
||||||
|
ulong result = 0;
|
||||||
|
result = ReadUInt16BE(stream);
|
||||||
|
result <<= 32;
|
||||||
|
result += ReadUInt32BE(stream);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ReadInt64LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8];
|
||||||
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToInt64(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ulong ReadUInt64LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8];
|
||||||
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToUInt64(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ulong ReadUInt64BE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8];
|
||||||
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 4);
|
||||||
|
return BitConverter.ToUInt64(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static byte[] ReadBytes(this Stream stream, long length)
|
||||||
|
{
|
||||||
|
if (length > Int32.MaxValue)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
if (length == 0)
|
||||||
|
return new byte[0];
|
||||||
|
if (length < 0)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
|
||||||
|
int length32 = (int)length;
|
||||||
|
|
||||||
|
byte[] buffer = new byte[length32];
|
||||||
|
if (stream.Read(buffer, 0, length32) != length32)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static sbyte[] ReadSBytes(this Stream stream, long length)
|
||||||
|
{
|
||||||
|
if (length > Int32.MaxValue)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
if (length == 0)
|
||||||
|
return new sbyte[0];
|
||||||
|
if (length < 0)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
|
||||||
|
int length32 = (int)length;
|
||||||
|
|
||||||
|
sbyte[] buffer = new sbyte[length32];
|
||||||
|
for (int i = 0; i < length32; i++)
|
||||||
|
{
|
||||||
|
buffer[i] = (sbyte)stream.ReadUInt8();
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static byte ReadUInt8(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[1];
|
||||||
|
if (stream.Read(buffer, 0, 1) != 1)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
|
||||||
|
return buffer[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static long GetAvailableBytes(this Stream stream)
|
||||||
|
{
|
||||||
|
if (stream is GZipStream)
|
||||||
|
{
|
||||||
|
GZipStream gzip = (GZipStream)stream;
|
||||||
|
long baseStreamPosition = gzip.BaseStream.Length - gzip.BaseStream.Position;
|
||||||
|
return baseStreamPosition;
|
||||||
|
}
|
||||||
|
return stream.Length - stream.Position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteUInt8Repeat(this Stream stream, byte uint8, int repetitions)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[repetitions];
|
||||||
|
Array.Fill(buffer, uint8);
|
||||||
|
stream.Write(buffer, 0, repetitions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint ReadUInt24BE(this Stream stream)
|
||||||
|
{
|
||||||
|
uint result = stream.ReadUInt16BE();
|
||||||
|
result <<= 8;
|
||||||
|
result += stream.ReadUInt8();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double ReadDoubleLE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8];
|
||||||
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer, 0, 8);
|
||||||
|
return BitConverter.ToDouble(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteUInt8(this Stream stream, byte value)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[1];
|
||||||
|
buffer[0] = value;
|
||||||
|
stream.Write(buffer, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteUInt16BE(this Stream stream, ushort value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1]) = (buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 2);
|
||||||
|
}
|
||||||
|
public static void WriteUInt16LE(this Stream stream, ushort value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1]) = (buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteInt32BE(this Stream stream, int value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteUInt32BE(this Stream stream, uint value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 4);
|
||||||
|
}
|
||||||
|
public static void WriteUInt32LE(this Stream stream, uint value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteInt32LE(this Stream stream, int value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteInt64LE(this Stream stream, long value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
(buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]) = (buffer[7], buffer[6], buffer[5], buffer[4], buffer[3], buffer[2], buffer[1], buffer[0]);
|
||||||
|
stream.Write(buffer, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ReadUTF8FixedLength(this Stream stream, int length)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[length];
|
||||||
|
if (stream.Read(buffer, 0, length) != length)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
return Encoding.UTF8.GetString(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ReadUTF16NullTerminated(this Stream stream)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
char c = (char)stream.ReadUInt16LE();
|
||||||
|
if (c == 0)
|
||||||
|
return sb.ToString();
|
||||||
|
sb.Append(c);
|
||||||
|
} while (stream.Position != stream.Length);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerStepThrough]
|
||||||
|
public static string ReadAsciiNullTerminated(this Stream stream)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
char c = (char)stream.ReadUInt8();
|
||||||
|
if (c == 0)
|
||||||
|
return sb.ToString();
|
||||||
|
sb.Append(c);
|
||||||
|
} while(stream.Position != stream.Length);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a variable-length integer to the stream.
|
||||||
|
/// (code generated by ChatGPT, model GPT-4o)
|
||||||
|
/// </summary>
|
||||||
|
public static void WriteVarInt(this Stream stream, long value)
|
||||||
|
{
|
||||||
|
while ((value & ~0x7F) != 0) // More than 7 bits left?
|
||||||
|
{
|
||||||
|
stream.WriteByte((byte)((value & 0x7F) | 0x80)); // Write 7 bits + set highest bit
|
||||||
|
value >>= 7; // Shift right by 7 bits
|
||||||
|
}
|
||||||
|
stream.WriteByte((byte)value); // Write last byte (highest bit unset)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a variable-length integer from the stream.
|
||||||
|
/// (code generated by ChatGPT, model GPT-4o)
|
||||||
|
/// </summary>
|
||||||
|
public static int ReadVarInt(this Stream stream)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int shift = 0;
|
||||||
|
byte currentByte;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
currentByte = (byte)stream.ReadByte();
|
||||||
|
result |= (currentByte & 0x7F) << shift; // Extract 7 bits and shift
|
||||||
|
shift += 7;
|
||||||
|
}
|
||||||
|
while ((currentByte & 0x80) != 0); // Continue while highest bit is set
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double ReadFloat64LE(this Stream stream)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8];
|
||||||
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer);
|
||||||
|
return BitConverter.ToDouble(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteFloat64LE(this Stream stream, double value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (!BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer);
|
||||||
|
stream.Write(buffer, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte Peek(this Stream stream)
|
||||||
|
{
|
||||||
|
if (!stream.CanSeek)
|
||||||
|
throw new NotSupportedException("Stream is not peekable");
|
||||||
|
if (stream.Position == stream.Length)
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
|
||||||
|
byte readUInt8 = stream.ReadUInt8();
|
||||||
|
stream.Position--;
|
||||||
|
return readUInt8;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DumpToFile(this Stream stream, string filename)
|
||||||
|
{
|
||||||
|
FileStream fileStream = File.OpenWrite(filename);
|
||||||
|
stream.CopyTo(fileStream);
|
||||||
|
fileStream.Flush(true);
|
||||||
|
fileStream.Close();
|
||||||
|
fileStream.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int TryReadExactly(this Stream stream, byte[] buffer, int offset, int count)
|
||||||
|
{
|
||||||
|
int totalRead = 0;
|
||||||
|
|
||||||
|
while (totalRead < count)
|
||||||
|
{
|
||||||
|
int bytesRead = stream.Read(buffer, offset + totalRead, count - totalRead);
|
||||||
|
if (bytesRead == 0)
|
||||||
|
{
|
||||||
|
// End of stream
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalRead += bytesRead;
|
||||||
|
}
|
||||||
|
return totalRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteDoubleBE(this Stream stream, double value)
|
||||||
|
{
|
||||||
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
|
if (BitConverter.IsLittleEndian)
|
||||||
|
Array.Reverse(buffer);
|
||||||
|
stream.Write(buffer, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double ReadDoubleBE(this Stream stream)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[8];
|
byte[] buffer = new byte[8];
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
if (stream.Read(buffer, 0, 8) != 8)
|
||||||
throw new EndOfStreamException();
|
throw new EndOfStreamException("failed to read double");
|
||||||
if (BitConverter.IsLittleEndian)
|
if (BitConverter.IsLittleEndian)
|
||||||
Array.Reverse(buffer, 0, 8);
|
Array.Reverse(buffer);
|
||||||
return BitConverter.ToDouble(buffer, 0);
|
return BitConverter.ToDouble(buffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void WriteUInt8(this Stream stream, byte value)
|
public static void WriteFloatBE(this Stream stream, float value)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[1];
|
byte[] buffer = BitConverter.GetBytes(value);
|
||||||
buffer[0] = value;
|
if (BitConverter.IsLittleEndian)
|
||||||
stream.Write(buffer, 0, 1);
|
Array.Reverse(buffer);
|
||||||
}
|
stream.Write(buffer, 0, 4);
|
||||||
|
}
|
||||||
public static void WriteUInt16BE(this Stream stream, ushort value)
|
|
||||||
{
|
public static float ReadFloatBE(this NetworkStream stream)
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
{
|
||||||
if (BitConverter.IsLittleEndian)
|
byte[] buffer = new byte[4];
|
||||||
(buffer[0], buffer[1]) = (buffer[1], buffer[0]);
|
if (stream.Read(buffer, 0, 4) != 4)
|
||||||
stream.Write(buffer, 0, 2);
|
throw new EndOfStreamException("failed to read float");
|
||||||
}
|
if (BitConverter.IsLittleEndian)
|
||||||
public static void WriteUInt16LE(this Stream stream, ushort value)
|
Array.Reverse(buffer);
|
||||||
{
|
return BitConverter.ToSingle(buffer, 0);
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
}
|
||||||
if (!BitConverter.IsLittleEndian)
|
}
|
||||||
(buffer[0], buffer[1]) = (buffer[1], buffer[0]);
|
}
|
||||||
stream.Write(buffer, 0, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteInt32BE(this Stream stream, int value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
|
||||||
stream.Write(buffer, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteUInt32BE(this Stream stream, uint value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
|
||||||
stream.Write(buffer, 0, 4);
|
|
||||||
}
|
|
||||||
public static void WriteUInt32LE(this Stream stream, uint value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
|
||||||
stream.Write(buffer, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteInt32LE(this Stream stream, int value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
(buffer[0], buffer[1], buffer[2], buffer[3]) = (buffer[3], buffer[2], buffer[1], buffer[0]);
|
|
||||||
stream.Write(buffer, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteInt64LE(this Stream stream, long value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
(buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]) = (buffer[7], buffer[6], buffer[5], buffer[4], buffer[3], buffer[2], buffer[1], buffer[0]);
|
|
||||||
stream.Write(buffer, 0, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ReadUTF8FixedLength(this Stream stream, int length)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[length];
|
|
||||||
if (stream.Read(buffer, 0, length) != length)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
return Encoding.UTF8.GetString(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ReadUTF16NullTerminated(this Stream stream)
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
char c = (char)stream.ReadUInt16LE();
|
|
||||||
if (c == 0)
|
|
||||||
return sb.ToString();
|
|
||||||
sb.Append(c);
|
|
||||||
} while (stream.Position != stream.Length);
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerStepThrough]
|
|
||||||
public static string ReadAsciiNullTerminated(this Stream stream)
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
char c = (char)stream.ReadUInt8();
|
|
||||||
if (c == 0)
|
|
||||||
return sb.ToString();
|
|
||||||
sb.Append(c);
|
|
||||||
} while(stream.Position != stream.Length);
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Writes a variable-length integer to the stream.
|
|
||||||
/// (code generated by ChatGPT, model GPT-4o)
|
|
||||||
/// </summary>
|
|
||||||
public static void WriteVarInt(this Stream stream, long value)
|
|
||||||
{
|
|
||||||
while ((value & ~0x7F) != 0) // More than 7 bits left?
|
|
||||||
{
|
|
||||||
stream.WriteByte((byte)((value & 0x7F) | 0x80)); // Write 7 bits + set highest bit
|
|
||||||
value >>= 7; // Shift right by 7 bits
|
|
||||||
}
|
|
||||||
stream.WriteByte((byte)value); // Write last byte (highest bit unset)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reads a variable-length integer from the stream.
|
|
||||||
/// (code generated by ChatGPT, model GPT-4o)
|
|
||||||
/// </summary>
|
|
||||||
public static int ReadVarInt(this Stream stream)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
int shift = 0;
|
|
||||||
byte currentByte;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
currentByte = (byte)stream.ReadByte();
|
|
||||||
result |= (currentByte & 0x7F) << shift; // Extract 7 bits and shift
|
|
||||||
shift += 7;
|
|
||||||
}
|
|
||||||
while ((currentByte & 0x80) != 0); // Continue while highest bit is set
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double ReadFloat64LE(this Stream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer, 0, 8) != 8)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
return BitConverter.ToDouble(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteFloat64LE(this Stream stream, double value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (!BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
stream.Write(buffer, 0, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte Peek(this Stream stream)
|
|
||||||
{
|
|
||||||
if (!stream.CanSeek)
|
|
||||||
throw new NotSupportedException("Stream is not peekable");
|
|
||||||
if (stream.Position == stream.Length)
|
|
||||||
throw new EndOfStreamException();
|
|
||||||
|
|
||||||
byte readUInt8 = stream.ReadUInt8();
|
|
||||||
stream.Position--;
|
|
||||||
return readUInt8;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DumpToFile(this Stream stream, string filename)
|
|
||||||
{
|
|
||||||
FileStream fileStream = File.OpenWrite(filename);
|
|
||||||
stream.CopyTo(fileStream);
|
|
||||||
fileStream.Flush(true);
|
|
||||||
fileStream.Close();
|
|
||||||
fileStream.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int TryReadExactly(this Stream stream, byte[] buffer, int offset, int count)
|
|
||||||
{
|
|
||||||
int totalRead = 0;
|
|
||||||
|
|
||||||
while (totalRead < count)
|
|
||||||
{
|
|
||||||
int bytesRead = stream.Read(buffer, offset + totalRead, count - totalRead);
|
|
||||||
if (bytesRead == 0)
|
|
||||||
{
|
|
||||||
// End of stream
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
totalRead += bytesRead;
|
|
||||||
}
|
|
||||||
return totalRead;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -152,41 +152,7 @@ namespace skyscraper5.Skyscraper.Net.Sockets
|
|||||||
return buffer[0];
|
return buffer[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void WriteDoubleBE(this NetworkStream stream, double value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
stream.Write(buffer, 0, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double ReadDoubleBE(this NetworkStream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[8];
|
|
||||||
if (stream.Read(buffer,0,8) != 8)
|
|
||||||
throw new EndOfStreamException("failed to read double");
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
return BitConverter.ToDouble(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteFloatBE(this NetworkStream stream, float value)
|
|
||||||
{
|
|
||||||
byte[] buffer = BitConverter.GetBytes(value);
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
stream.Write(buffer, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float ReadFloatBE(this NetworkStream stream)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[4];
|
|
||||||
if (stream.Read(buffer, 0, 4) != 4)
|
|
||||||
throw new EndOfStreamException("failed to read float");
|
|
||||||
if (BitConverter.IsLittleEndian)
|
|
||||||
Array.Reverse(buffer);
|
|
||||||
return BitConverter.ToSingle(buffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteIntPtr(this NetworkStream stream, IntPtr ptr)
|
public static void WriteIntPtr(this NetworkStream stream, IntPtr ptr)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user