diff --git a/skyscraper8/Skyscraper/IO/StreamExtensions.cs b/skyscraper8/Skyscraper/IO/StreamExtensions.cs index 42c23e9..8a917d8 100644 --- a/skyscraper8/Skyscraper/IO/StreamExtensions.cs +++ b/skyscraper8/Skyscraper/IO/StreamExtensions.cs @@ -1,401 +1,427 @@ -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.IO.Compression; -using System.Net.Sockets; -using System.Runtime.CompilerServices; -using System.Text; - -namespace skyscraper5.Skyscraper.IO -{ - public static class StreamExtensions - { - [DebuggerStepThrough] - public static ushort ReadUInt16BE(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); - } - - public static short ReadInt16LE(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.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); +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Text; + +namespace skyscraper5.Skyscraper.IO +{ + public static class StreamExtensions + { + [DebuggerStepThrough] + public static ushort ReadUInt16BE(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); + } + + public static short ReadInt16LE(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.ToInt16(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(); + } + + /// + /// Writes a variable-length integer to the stream. + /// (code generated by ChatGPT, model GPT-4o) + /// + 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) + } + + /// + /// Reads a variable-length integer from the stream. + /// (code generated by ChatGPT, model GPT-4o) + /// + 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]; if (stream.Read(buffer, 0, 8) != 8) - throw new EndOfStreamException(); + throw new EndOfStreamException("failed to read double"); if (BitConverter.IsLittleEndian) - Array.Reverse(buffer, 0, 8); + Array.Reverse(buffer); 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(); - } - - /// - /// Writes a variable-length integer to the stream. - /// (code generated by ChatGPT, model GPT-4o) - /// - 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) - } - - /// - /// Reads a variable-length integer from the stream. - /// (code generated by ChatGPT, model GPT-4o) - /// - 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 WriteFloatBE(this Stream 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); + } + } +} diff --git a/skyscraper8/Skyscraper/Net/Sockets/NetworkStreamExtensions.cs b/skyscraper8/Skyscraper/Net/Sockets/NetworkStreamExtensions.cs index d99b17a..70bcc07 100644 --- a/skyscraper8/Skyscraper/Net/Sockets/NetworkStreamExtensions.cs +++ b/skyscraper8/Skyscraper/Net/Sockets/NetworkStreamExtensions.cs @@ -152,41 +152,7 @@ namespace skyscraper5.Skyscraper.Net.Sockets 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) {