From 075846652f3624930cef465641028fe494d7d02e Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 10 Aug 2023 14:44:24 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- genProto | Bin 66117 -> 0 bytes genProto.cmd | 2 - test/cs/BigEndianBitConverter.cs | 67 ++ test/cs/ConsoleApp2.csproj | 12 + test/cs/EndianBinaryReader.cs | 599 +++++++++++++++ test/cs/EndianBinaryWriter.cs | 392 ++++++++++ test/cs/EndianBitConverter.cs | 696 ++++++++++++++++++ test/cs/Endianness.cs | 17 + test/cs/LittleEndianBitConverter.cs | 66 ++ test/cs/ProtoTest.cs | 14 + test/{ => cs}/protoMsg.cs | 0 test/{v1 => erl/erlv1}/protoMsg.erl | 0 test/{v1 => erl/erlv1}/protoMsg.hrl | 0 test/{v1/test.erl => erl/erlv1/protoTest.erl} | 2 +- test/{ => erl/erlv1}/start.bat | 0 test/{ => erl}/protoMsg.erl | 0 test/{ => erl}/protoMsg.hrl | 0 test/{test.erl => erl/protoTest.erl} | 4 +- test/{ => erl}/remake.bat | 0 test/{ => erl}/remake.sh | 0 test/gen.bat | 2 +- test/gen.sh | 2 +- test/genProto | Bin 105022 -> 0 bytes test/genProto.cmd | 2 - test/lua/ByteArray.lua | 251 +++++++ .../lua/ByteArray_back.lua | 0 test/{ => lua}/protoMsg.lua | 0 test/{ => lua}/protoName.lua | 0 test/lua/protoTest.lua | 19 + test/v1/start.bat | 1 - 30 files changed, 2138 insertions(+), 10 deletions(-) delete mode 100644 genProto delete mode 100644 genProto.cmd create mode 100644 test/cs/BigEndianBitConverter.cs create mode 100644 test/cs/ConsoleApp2.csproj create mode 100644 test/cs/EndianBinaryReader.cs create mode 100644 test/cs/EndianBinaryWriter.cs create mode 100644 test/cs/EndianBitConverter.cs create mode 100644 test/cs/Endianness.cs create mode 100644 test/cs/LittleEndianBitConverter.cs create mode 100644 test/cs/ProtoTest.cs rename test/{ => cs}/protoMsg.cs (100%) rename test/{v1 => erl/erlv1}/protoMsg.erl (100%) rename test/{v1 => erl/erlv1}/protoMsg.hrl (100%) rename test/{v1/test.erl => erl/erlv1/protoTest.erl} (99%) rename test/{ => erl/erlv1}/start.bat (100%) rename test/{ => erl}/protoMsg.erl (100%) rename test/{ => erl}/protoMsg.hrl (100%) rename test/{test.erl => erl/protoTest.erl} (99%) rename test/{ => erl}/remake.bat (100%) rename test/{ => erl}/remake.sh (100%) delete mode 100644 test/genProto delete mode 100644 test/genProto.cmd create mode 100644 test/lua/ByteArray.lua rename src/writeLua/ByteArray.lua => test/lua/ByteArray_back.lua (100%) rename test/{ => lua}/protoMsg.lua (100%) rename test/{ => lua}/protoName.lua (100%) create mode 100644 test/lua/protoTest.lua delete mode 100644 test/v1/start.bat diff --git a/genProto b/genProto deleted file mode 100644 index 6c13fc73dcca43753d068774038973653f32a5c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66117 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
;B=bXma`L= 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 + /// Implementation of EndianBitConverter which converts to/from big-endian + /// byte arrays. + /// + public sealed class BigEndianBitConverter : EndianBitConverter + { + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + /// + /// Different computer architectures store data using different byte orders. "Big-endian" + /// means the most significant byte is on the left end of a word. "Little-endian" means the + /// most significant byte is on the right end of a word. + /// + /// true if this converter is little-endian, false otherwise. + public sealed override bool IsLittleEndian() + { + return false; + } + + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + public sealed override Endianness Endianness + { + get { return Endianness.BigEndian; } + } + + /// + /// Copies the specified number of bytes from value to buffer, starting at index. + /// + /// The value to copy + /// The number of bytes to copy + /// The buffer to copy the bytes into + /// The index to start at + protected override void CopyBytesImpl(long value, int bytes, byte[] buffer, int index) + { + int endOffset = index+bytes-1; + for (int i=0; i < bytes; i++) + { + buffer[endOffset-i] = unchecked((byte)(value&0xff)); + value = value >> 8; + } + } + + /// + /// Returns a value built from the specified number of bytes from the given buffer, + /// starting at index. + /// + /// The data in byte array format + /// The first index to use + /// The number of bytes to use + /// The value built from the given bytes + protected override long FromBytes(byte[] buffer, int startIndex, int bytesToConvert) + { + long ret = 0; + for (int i=0; i < bytesToConvert; i++) + { + ret = unchecked((ret << 8) | buffer[startIndex+i]); + } + return ret; + } + } +} \ No newline at end of file diff --git a/test/cs/ConsoleApp2.csproj b/test/cs/ConsoleApp2.csproj new file mode 100644 index 0000000..003f8fe --- /dev/null +++ b/test/cs/ConsoleApp2.csproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + enable + enable + + + + + diff --git a/test/cs/EndianBinaryReader.cs b/test/cs/EndianBinaryReader.cs new file mode 100644 index 0000000..c3e1cb0 --- /dev/null +++ b/test/cs/EndianBinaryReader.cs @@ -0,0 +1,599 @@ +using System; +using System.IO; +using System.Text; +using MiscUtil.Conversion; + +namespace MiscUtil.IO +{ + /// + /// Equivalent of System.IO.BinaryReader, but with either endianness, depending on + /// the EndianBitConverter it is constructed with. No data is buffered in the + /// reader; the client may seek within the stream at will. + /// + public class EndianBinaryReader : IDisposable + { + #region Fields not directly related to properties + /// + /// Whether or not this reader has been disposed yet. + /// + bool disposed=false; + /// + /// Decoder to use for string conversions. + /// + Decoder decoder; + /// + /// Buffer used for temporary storage before conversion into primitives + /// + byte[] buffer = new byte[16]; + /// + /// Buffer used for temporary storage when reading a single character + /// + char[] charBuffer = new char[1]; + /// + /// Minimum number of bytes used to encode a character + /// + int minBytesPerChar; + #endregion + + #region Constructors + /// + /// Equivalent of System.IO.BinaryWriter, but with either endianness, depending on + /// the EndianBitConverter it is constructed with. + /// + /// Converter to use when reading data + /// Stream to read data from + public EndianBinaryReader (EndianBitConverter bitConverter, + Stream stream) : this (bitConverter, stream, Encoding.UTF8) + { + } + + /// + /// Constructs a new binary reader with the given bit converter, reading + /// to the given stream, using the given encoding. + /// + /// Converter to use when reading data + /// Stream to read data from + /// Encoding to use when reading character data + public EndianBinaryReader (EndianBitConverter bitConverter, Stream stream, Encoding encoding) + { + if (bitConverter==null) + { + throw new ArgumentNullException("bitConverter"); + } + if (stream==null) + { + throw new ArgumentNullException("stream"); + } + if (encoding==null) + { + throw new ArgumentNullException("encoding"); + } + if (!stream.CanRead) + { + throw new ArgumentException("Stream isn't writable", "stream"); + } + this.stream = stream; + this.bitConverter = bitConverter; + this.encoding = encoding; + this.decoder = encoding.GetDecoder(); + this.minBytesPerChar = 1; + + if (encoding is UnicodeEncoding) + { + minBytesPerChar = 2; + } + } + #endregion + + #region Properties + EndianBitConverter bitConverter; + /// + /// The bit converter used to read values from the stream + /// + public EndianBitConverter BitConverter + { + get { return bitConverter; } + } + + Encoding encoding; + /// + /// The encoding used to read strings + /// + public Encoding Encoding + { + get { return encoding; } + } + + Stream stream; + /// + /// Gets the underlying stream of the EndianBinaryReader. + /// + public Stream BaseStream + { + get { return stream; } + } + #endregion + + #region Public methods + /// + /// Closes the reader, including the underlying stream.. + /// + public void Close() + { + Dispose(); + } + + /// + /// Seeks within the stream. + /// + /// Offset to seek to. + /// Origin of seek operation. + public void Seek (int offset, SeekOrigin origin) + { + CheckDisposed(); + stream.Seek (offset, origin); + } + + /// + /// Reads a single byte from the stream. + /// + /// The byte read + public byte ReadByte() + { + ReadInternal(buffer, 1); + return buffer[0]; + } + + /// + /// Reads a single signed byte from the stream. + /// + /// The byte read + public sbyte ReadSByte() + { + ReadInternal(buffer, 1); + return unchecked((sbyte)buffer[0]); + } + + /// + /// Reads a boolean from the stream. 1 byte is read. + /// + /// The boolean read + public bool ReadBoolean() + { + ReadInternal(buffer, 1); + return bitConverter.ToBoolean(buffer, 0); + } + + /// + /// Reads a 16-bit signed integer from the stream, using the bit converter + /// for this reader. 2 bytes are read. + /// + /// The 16-bit integer read + public short ReadInt16() + { + ReadInternal(buffer, 2); + return bitConverter.ToInt16(buffer, 0); + } + + /// + /// Reads a 32-bit signed integer from the stream, using the bit converter + /// for this reader. 4 bytes are read. + /// + /// The 32-bit integer read + public int ReadInt32() + { + ReadInternal(buffer, 4); + return bitConverter.ToInt32(buffer, 0); + } + + /// + /// Reads a 64-bit signed integer from the stream, using the bit converter + /// for this reader. 8 bytes are read. + /// + /// The 64-bit integer read + public long ReadInt64() + { + ReadInternal(buffer, 8); + return bitConverter.ToInt64(buffer, 0); + } + + /// + /// Reads a 16-bit unsigned integer from the stream, using the bit converter + /// for this reader. 2 bytes are read. + /// + /// The 16-bit unsigned integer read + public ushort ReadUInt16() + { + ReadInternal(buffer, 2); + return bitConverter.ToUInt16(buffer, 0); + } + + /// + /// Reads a 32-bit unsigned integer from the stream, using the bit converter + /// for this reader. 4 bytes are read. + /// + /// The 32-bit unsigned integer read + public uint ReadUInt32() + { + ReadInternal(buffer, 4); + return bitConverter.ToUInt32(buffer, 0); + } + + /// + /// Reads a 64-bit unsigned integer from the stream, using the bit converter + /// for this reader. 8 bytes are read. + /// + /// The 64-bit unsigned integer read + public ulong ReadUInt64() + { + ReadInternal(buffer, 8); + return bitConverter.ToUInt64(buffer, 0); + } + + /// + /// Reads a single-precision floating-point value from the stream, using the bit converter + /// for this reader. 4 bytes are read. + /// + /// The floating point value read + public float ReadSingle() + { + ReadInternal(buffer, 4); + return bitConverter.ToSingle(buffer, 0); + } + + /// + /// Reads a double-precision floating-point value from the stream, using the bit converter + /// for this reader. 8 bytes are read. + /// + /// The floating point value read + public double ReadDouble() + { + ReadInternal(buffer, 8); + return bitConverter.ToDouble(buffer, 0); + } + + /// + /// Reads a decimal value from the stream, using the bit converter + /// for this reader. 16 bytes are read. + /// + /// The decimal value read + public decimal ReadDecimal() + { + ReadInternal(buffer, 16); + return bitConverter.ToDecimal(buffer, 0); + } + + /// + /// Reads a single character from the stream, using the character encoding for + /// this reader. If no characters have been fully read by the time the stream ends, + /// -1 is returned. + /// + /// The character read, or -1 for end of stream. + public int Read() + { + int charsRead = Read(charBuffer, 0, 1); + if (charsRead==0) + { + return -1; + } + else + { + return charBuffer[0]; + } + } + + /// + /// Reads the specified number of characters into the given buffer, starting at + /// the given index. + /// + /// The buffer to copy data into + /// The first index to copy data into + /// The number of characters to read + /// The number of characters actually read. This will only be less than + /// the requested number of characters if the end of the stream is reached. + /// + public int Read(char[] data, int index, int count) + { + CheckDisposed(); + if (buffer==null) + { + throw new ArgumentNullException("buffer"); + } + if (index < 0) + { + throw new ArgumentOutOfRangeException("index"); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException("index"); + } + if (count+index > data.Length) + { + throw new ArgumentException + ("Not enough space in buffer for specified number of characters starting at specified index"); + } + + int read=0; + bool firstTime=true; + + // Use the normal buffer if we're only reading a small amount, otherwise + // use at most 4K at a time. + byte[] byteBuffer = buffer; + + if (byteBuffer.Length < count*minBytesPerChar) + { + byteBuffer = new byte[4096]; + } + + while (read < count) + { + int amountToRead; + // First time through we know we haven't previously read any data + if (firstTime) + { + amountToRead = count*minBytesPerChar; + firstTime=false; + } + // After that we can only assume we need to fully read "chars left -1" characters + // and a single byte of the character we may be in the middle of + else + { + amountToRead = ((count-read-1)*minBytesPerChar)+1; + } + if (amountToRead > byteBuffer.Length) + { + amountToRead = byteBuffer.Length; + } + int bytesRead = TryReadInternal(byteBuffer, amountToRead); + if (bytesRead==0) + { + return read; + } + int decoded = decoder.GetChars(byteBuffer, 0, bytesRead, data, index); + read += decoded; + index += decoded; + } + return read; + } + + /// + /// Reads the specified number of bytes into the given buffer, starting at + /// the given index. + /// + /// The buffer to copy data into + /// The first index to copy data into + /// The number of bytes to read + /// The number of bytes actually read. This will only be less than + /// the requested number of bytes if the end of the stream is reached. + /// + public int Read(byte[] buffer, int index, int count) + { + CheckDisposed(); + if (buffer==null) + { + throw new ArgumentNullException("buffer"); + } + if (index < 0) + { + throw new ArgumentOutOfRangeException("index"); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException("index"); + } + if (count+index > buffer.Length) + { + throw new ArgumentException + ("Not enough space in buffer for specified number of bytes starting at specified index"); + } + int read=0; + while (count > 0) + { + int block = stream.Read(buffer, index, count); + if (block==0) + { + return read; + } + index += block; + read += block; + count -= block; + } + return read; + } + + /// + /// Reads the specified number of bytes, returning them in a new byte array. + /// If not enough bytes are available before the end of the stream, this + /// method will return what is available. + /// + /// The number of bytes to read + /// The bytes read + public byte[] ReadBytes(int count) + { + CheckDisposed(); + if (count < 0) + { + throw new ArgumentOutOfRangeException("count"); + } + byte[] ret = new byte[count]; + int index=0; + while (index < count) + { + int read = stream.Read(ret, index, count-index); + // Stream has finished half way through. That's fine, return what we've got. + if (read==0) + { + byte[] copy = new byte[index]; + Buffer.BlockCopy(ret, 0, copy, 0, index); + return copy; + } + index += read; + } + return ret; + } + + /// + /// Reads the specified number of bytes, returning them in a new byte array. + /// If not enough bytes are available before the end of the stream, this + /// method will throw an IOException. + /// + /// The number of bytes to read + /// The bytes read + public byte[] ReadBytesOrThrow(int count) + { + byte[] ret = new byte[count]; + ReadInternal(ret, count); + return ret; + } + + /// + /// Reads a 7-bit encoded integer from the stream. This is stored with the least significant + /// information first, with 7 bits of information per byte of value, and the top + /// bit as a continuation flag. This method is not affected by the endianness + /// of the bit converter. + /// + /// The 7-bit encoded integer read from the stream. + public int Read7BitEncodedInt() + { + CheckDisposed(); + + int ret=0; + for (int shift = 0; shift < 35; shift+=7) + { + int b = stream.ReadByte(); + if (b==-1) + { + throw new EndOfStreamException(); + } + ret = ret | ((b&0x7f) << shift); + if ((b & 0x80) == 0) + { + return ret; + } + } + // Still haven't seen a byte with the high bit unset? Dodgy data. + throw new IOException("Invalid 7-bit encoded integer in stream."); + } + + /// + /// Reads a 7-bit encoded integer from the stream. This is stored with the most significant + /// information first, with 7 bits of information per byte of value, and the top + /// bit as a continuation flag. This method is not affected by the endianness + /// of the bit converter. + /// + /// The 7-bit encoded integer read from the stream. + public int ReadBigEndian7BitEncodedInt() + { + CheckDisposed(); + + int ret=0; + for (int i=0; i < 5; i++) + { + int b = stream.ReadByte(); + if (b==-1) + { + throw new EndOfStreamException(); + } + ret = (ret << 7) | (b&0x7f); + if ((b & 0x80) == 0) + { + return ret; + } + } + // Still haven't seen a byte with the high bit unset? Dodgy data. + throw new IOException("Invalid 7-bit encoded integer in stream."); + } + + /// + /// Reads a length-prefixed string from the stream, using the encoding for this reader. + /// A 7-bit encoded integer is first read, which specifies the number of bytes + /// to read from the stream. These bytes are then converted into a string with + /// the encoding for this reader. + /// + /// The string read from the stream. + public string ReadString() + { + int bytesToRead = Read7BitEncodedInt(); + + byte[] data = new byte[bytesToRead]; + ReadInternal(data, bytesToRead); + return encoding.GetString(data, 0, data.Length); + } + + #endregion + + #region Private methods + /// + /// Checks whether or not the reader has been disposed, throwing an exception if so. + /// + void CheckDisposed() + { + if (disposed) + { + throw new ObjectDisposedException("EndianBinaryReader"); + } + } + + /// + /// Reads the given number of bytes from the stream, throwing an exception + /// if they can't all be read. + /// + /// Buffer to read into + /// Number of bytes to read + void ReadInternal (byte[] data, int size) + { + CheckDisposed(); + int index=0; + while (index < size) + { + int read = stream.Read(data, index, size-index); + if (read==0) + { + throw new EndOfStreamException + (String.Format("End of stream reached with {0} byte{1} left to read.", size-index, + size-index==1 ? "s" : "")); + } + index += read; + } + } + + /// + /// Reads the given number of bytes from the stream if possible, returning + /// the number of bytes actually read, which may be less than requested if + /// (and only if) the end of the stream is reached. + /// + /// Buffer to read into + /// Number of bytes to read + /// Number of bytes actually read + int TryReadInternal (byte[] data, int size) + { + CheckDisposed(); + int index=0; + while (index < size) + { + int read = stream.Read(data, index, size-index); + if (read==0) + { + return index; + } + index += read; + } + return index; + } + #endregion + + #region IDisposable Members + /// + /// Disposes of the underlying stream. + /// + public void Dispose() + { + if (!disposed) + { + disposed = true; + ((IDisposable)stream).Dispose(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/test/cs/EndianBinaryWriter.cs b/test/cs/EndianBinaryWriter.cs new file mode 100644 index 0000000..5feea62 --- /dev/null +++ b/test/cs/EndianBinaryWriter.cs @@ -0,0 +1,392 @@ +using System; +using System.IO; +using System.Text; +using MiscUtil.Conversion; + +namespace MiscUtil.IO +{ + /// + /// Equivalent of System.IO.BinaryWriter, but with either endianness, depending on + /// the EndianBitConverter it is constructed with. + /// + public class EndianBinaryWriter : IDisposable + { + #region Fields not directly related to properties + /// + /// Whether or not this writer has been disposed yet. + /// + bool disposed=false; + /// + /// Buffer used for temporary storage during conversion from primitives + /// + byte[] buffer = new byte[16]; + /// + /// Buffer used for Write(char) + /// + char[] charBuffer = new char[1]; + #endregion + + #region Constructors + /// + /// Constructs a new binary writer with the given bit converter, writing + /// to the given stream, using UTF-8 encoding. + /// + /// Converter to use when writing data + /// Stream to write data to + public EndianBinaryWriter (EndianBitConverter bitConverter, + Stream stream) : this (bitConverter, stream, Encoding.UTF8) + { + } + + /// + /// Constructs a new binary writer with the given bit converter, writing + /// to the given stream, using the given encoding. + /// + /// Converter to use when writing data + /// Stream to write data to + /// Encoding to use when writing character data + public EndianBinaryWriter (EndianBitConverter bitConverter, Stream stream, Encoding encoding) + { + if (bitConverter==null) + { + throw new ArgumentNullException("bitConverter"); + } + if (stream==null) + { + throw new ArgumentNullException("stream"); + } + if (encoding==null) + { + throw new ArgumentNullException("encoding"); + } + if (!stream.CanWrite) + { + throw new ArgumentException("Stream isn't writable", "stream"); + } + this.stream = stream; + this.bitConverter = bitConverter; + this.encoding = encoding; + } + #endregion + + #region Properties + EndianBitConverter bitConverter; + /// + /// The bit converter used to write values to the stream + /// + public EndianBitConverter BitConverter + { + get { return bitConverter; } + } + + Encoding encoding; + /// + /// The encoding used to write strings + /// + public Encoding Encoding + { + get { return encoding; } + } + + Stream stream; + /// + /// Gets the underlying stream of the EndianBinaryWriter. + /// + public Stream BaseStream + { + get { return stream; } + } + #endregion + + #region Public methods + /// + /// Closes the writer, including the underlying stream. + /// + public void Close() + { + Dispose(); + } + + /// + /// Flushes the underlying stream. + /// + public void Flush() + { + CheckDisposed(); + stream.Flush(); + } + + /// + /// Seeks within the stream. + /// + /// Offset to seek to. + /// Origin of seek operation. + public void Seek (int offset, SeekOrigin origin) + { + CheckDisposed(); + stream.Seek (offset, origin); + } + + /// + /// Writes a boolean value to the stream. 1 byte is written. + /// + /// The value to write + public void Write (bool value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 1); + } + + /// + /// Writes a 16-bit signed integer to the stream, using the bit converter + /// for this writer. 2 bytes are written. + /// + /// The value to write + public void Write (short value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 2); + } + + /// + /// Writes a 32-bit signed integer to the stream, using the bit converter + /// for this writer. 4 bytes are written. + /// + /// The value to write + public void Write (int value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 4); + } + + /// + /// Writes a 64-bit signed integer to the stream, using the bit converter + /// for this writer. 8 bytes are written. + /// + /// The value to write + public void Write (long value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 8); + } + + /// + /// Writes a 16-bit unsigned integer to the stream, using the bit converter + /// for this writer. 2 bytes are written. + /// + /// The value to write + public void Write (ushort value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 2); + } + + /// + /// Writes a 32-bit unsigned integer to the stream, using the bit converter + /// for this writer. 4 bytes are written. + /// + /// The value to write + public void Write (uint value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 4); + } + + /// + /// Writes a 64-bit unsigned integer to the stream, using the bit converter + /// for this writer. 8 bytes are written. + /// + /// The value to write + public void Write (ulong value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 8); + } + + /// + /// Writes a single-precision floating-point value to the stream, using the bit converter + /// for this writer. 4 bytes are written. + /// + /// The value to write + public void Write (float value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 4); + } + + /// + /// Writes a double-precision floating-point value to the stream, using the bit converter + /// for this writer. 8 bytes are written. + /// + /// The value to write + public void Write (double value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 8); + } + + /// + /// Writes a decimal value to the stream, using the bit converter for this writer. + /// 16 bytes are written. + /// + /// The value to write + public void Write (decimal value) + { + bitConverter.CopyBytes(value, buffer, 0); + WriteInternal(buffer, 16); + } + + /// + /// Writes a signed byte to the stream. + /// + /// The value to write + public void Write (byte value) + { + buffer[0] = value; + WriteInternal(buffer, 1); + } + + /// + /// Writes an unsigned byte to the stream. + /// + /// The value to write + public void Write (sbyte value) + { + buffer[0] = unchecked((byte)value); + WriteInternal(buffer, 1); + } + + /// + /// Writes an array of bytes to the stream. + /// + /// The values to write + public void Write (byte[] value) + { + if (value == null) + { + throw (new System.ArgumentNullException("value")); + } + WriteInternal(value, value.Length); + } + + /// + /// Writes a portion of an array of bytes to the stream. + /// + /// An array containing the bytes to write + /// The index of the first byte to write within the array + /// The number of bytes to write + public void Write (byte[] value, int offset, int count) + { + CheckDisposed(); + stream.Write(value, offset, count); + } + + /// + /// Writes a single character to the stream, using the encoding for this writer. + /// + /// The value to write + public void Write(char value) + { + charBuffer[0] = value; + Write(charBuffer); + } + + /// + /// Writes an array of characters to the stream, using the encoding for this writer. + /// + /// An array containing the characters to write + public void Write(char[] value) + { + if (value==null) + { + throw new ArgumentNullException("value"); + } + CheckDisposed(); + byte[] data = Encoding.GetBytes(value, 0, value.Length); + WriteInternal(data, data.Length); + } + + /// + /// Writes a string to the stream, using the encoding for this writer. + /// + /// The value to write. Must not be null. + /// value is null + public void Write(string value) + { + if (value==null) + { + throw new ArgumentNullException("value"); + } + CheckDisposed(); + byte[] data = Encoding.GetBytes(value); + Write7BitEncodedInt(data.Length); + WriteInternal(data, data.Length); + } + + /// + /// Writes a 7-bit encoded integer from the stream. This is stored with the least significant + /// information first, with 7 bits of information per byte of value, and the top + /// bit as a continuation flag. + /// + /// The 7-bit encoded integer to write to the stream + public void Write7BitEncodedInt(int value) + { + CheckDisposed(); + if (value < 0) + { + throw new ArgumentOutOfRangeException("value", "Value must be greater than or equal to 0."); + } + int index=0; + while (value >= 128) + { + buffer[index++]= (byte)((value&0x7f) | 0x80); + value = value >> 7; + index++; + } + buffer[index++]=(byte)value; + stream.Write(buffer, 0, index); + } + + #endregion + + #region Private methods + /// + /// Checks whether or not the writer has been disposed, throwing an exception if so. + /// + void CheckDisposed() + { + if (disposed) + { + throw new ObjectDisposedException("EndianBinaryWriter"); + } + } + + /// + /// Writes the specified number of bytes from the start of the given byte array, + /// after checking whether or not the writer has been disposed. + /// + /// The array of bytes to write from + /// The number of bytes to write + void WriteInternal (byte[] bytes, int length) + { + CheckDisposed(); + stream.Write(bytes, 0, length); + } + #endregion + + #region IDisposable Members + /// + /// Disposes of the underlying stream. + /// + public void Dispose() + { + if (!disposed) + { + Flush(); + disposed = true; + ((IDisposable)stream).Dispose(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/test/cs/EndianBitConverter.cs b/test/cs/EndianBitConverter.cs new file mode 100644 index 0000000..aa8774d --- /dev/null +++ b/test/cs/EndianBitConverter.cs @@ -0,0 +1,696 @@ +using System; +using System.Runtime.InteropServices; + +namespace MiscUtil.Conversion +{ + /// + /// Equivalent of System.BitConverter, but with either endianness. + /// + public abstract class EndianBitConverter + { + #region Endianness of this converter + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + /// + /// Different computer architectures store data using different byte orders. "Big-endian" + /// means the most significant byte is on the left end of a word. "Little-endian" means the + /// most significant byte is on the right end of a word. + /// + /// true if this converter is little-endian, false otherwise. + public abstract bool IsLittleEndian(); + + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + public abstract Endianness Endianness { get; } + #endregion + + #region Factory properties + static LittleEndianBitConverter little = new LittleEndianBitConverter(); + /// + /// Returns a little-endian bit converter instance. The same instance is + /// always returned. + /// + public static LittleEndianBitConverter Little + { + get { return little; } + } + + static BigEndianBitConverter big = new BigEndianBitConverter(); + /// + /// Returns a big-endian bit converter instance. The same instance is + /// always returned. + /// + public static BigEndianBitConverter Big + { + get { return big; } + } + #endregion + + #region Double/primitive conversions + /// + /// Converts the specified double-precision floating point number to a + /// 64-bit signed integer. Note: the endianness of this converter does not + /// affect the returned value. + /// + /// The number to convert. + /// A 64-bit signed integer whose value is equivalent to value. + public long DoubleToInt64Bits(double value) + { + return BitConverter.DoubleToInt64Bits(value); + } + + /// + /// Converts the specified 64-bit signed integer to a double-precision + /// floating point number. Note: the endianness of this converter does not + /// affect the returned value. + /// + /// The number to convert. + /// A double-precision floating point number whose value is equivalent to value. + public double Int64BitsToDouble (long value) + { + return BitConverter.Int64BitsToDouble(value); + } + + /// + /// Converts the specified single-precision floating point number to a + /// 32-bit signed integer. Note: the endianness of this converter does not + /// affect the returned value. + /// + /// The number to convert. + /// A 32-bit signed integer whose value is equivalent to value. + public int SingleToInt32Bits(float value) + { + return new Int32SingleUnion(value).AsInt32; + } + + /// + /// Converts the specified 32-bit signed integer to a single-precision floating point + /// number. Note: the endianness of this converter does not + /// affect the returned value. + /// + /// The number to convert. + /// A single-precision floating point number whose value is equivalent to value. + public float Int32BitsToSingle (int value) + { + return new Int32SingleUnion(value).AsSingle; + } + #endregion + + #region To(PrimitiveType) conversions + /// + /// Returns a Boolean value converted from one byte at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// true if the byte at startIndex in value is nonzero; otherwise, false. + public bool ToBoolean (byte[] value, int startIndex) + { + CheckByteArgument(value, startIndex, 1); + return BitConverter.ToBoolean(value, startIndex); + } + + /// + /// Returns a Unicode character converted from two bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A character formed by two bytes beginning at startIndex. + public char ToChar (byte[] value, int startIndex) + { + return unchecked((char) (CheckedFromBytes(value, startIndex, 2))); + } + + /// + /// Returns a double-precision floating point number converted from eight bytes + /// at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A double precision floating point number formed by eight bytes beginning at startIndex. + public double ToDouble (byte[] value, int startIndex) + { + return Int64BitsToDouble(ToInt64(value, startIndex)); + } + + /// + /// Returns a single-precision floating point number converted from four bytes + /// at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A single precision floating point number formed by four bytes beginning at startIndex. + public float ToSingle (byte[] value, int startIndex) + { + return Int32BitsToSingle(ToInt32(value, startIndex)); + } + + /// + /// Returns a 16-bit signed integer converted from two bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 16-bit signed integer formed by two bytes beginning at startIndex. + public short ToInt16 (byte[] value, int startIndex) + { + return unchecked((short) (CheckedFromBytes(value, startIndex, 2))); + } + + /// + /// Returns a 32-bit signed integer converted from four bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 32-bit signed integer formed by four bytes beginning at startIndex. + public int ToInt32 (byte[] value, int startIndex) + { + return unchecked((int) (CheckedFromBytes(value, startIndex, 4))); + } + + /// + /// Returns a 64-bit signed integer converted from eight bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 64-bit signed integer formed by eight bytes beginning at startIndex. + public long ToInt64 (byte[] value, int startIndex) + { + return CheckedFromBytes(value, startIndex, 8); + } + + /// + /// Returns a 16-bit unsigned integer converted from two bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 16-bit unsigned integer formed by two bytes beginning at startIndex. + public ushort ToUInt16 (byte[] value, int startIndex) + { + return unchecked((ushort) (CheckedFromBytes(value, startIndex, 2))); + } + + /// + /// Returns a 32-bit unsigned integer converted from four bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 32-bit unsigned integer formed by four bytes beginning at startIndex. + public uint ToUInt32 (byte[] value, int startIndex) + { + return unchecked((uint) (CheckedFromBytes(value, startIndex, 4))); + } + + /// + /// Returns a 64-bit unsigned integer converted from eight bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A 64-bit unsigned integer formed by eight bytes beginning at startIndex. + public ulong ToUInt64 (byte[] value, int startIndex) + { + return unchecked((ulong) (CheckedFromBytes(value, startIndex, 8))); + } + + /// + /// Checks the given argument for validity. + /// + /// The byte array passed in + /// The start index passed in + /// The number of bytes required + /// value is a null reference + /// + /// startIndex is less than zero or greater than the length of value minus bytesRequired. + /// + static void CheckByteArgument(byte[] value, int startIndex, int bytesRequired) + { + if (value==null) + { + throw new ArgumentNullException("value"); + } + if (startIndex < 0 || startIndex > value.Length-bytesRequired) + { + throw new ArgumentOutOfRangeException("startIndex"); + } + } + + /// + /// Checks the arguments for validity before calling FromBytes + /// (which can therefore assume the arguments are valid). + /// + /// The bytes to convert after checking + /// The index of the first byte to convert + /// The number of bytes to convert + /// + long CheckedFromBytes(byte[] value, int startIndex, int bytesToConvert) + { + CheckByteArgument(value, startIndex, bytesToConvert); + return FromBytes(value, startIndex, bytesToConvert); + } + + /// + /// Convert the given number of bytes from the given array, from the given start + /// position, into a long, using the bytes as the least significant part of the long. + /// By the time this is called, the arguments have been checked for validity. + /// + /// The bytes to convert + /// The index of the first byte to convert + /// The number of bytes to use in the conversion + /// The converted number + protected abstract long FromBytes(byte[] value, int startIndex, int bytesToConvert); + #endregion + + #region ToString conversions + /// + /// Returns a String converted from the elements of a byte array. + /// + /// An array of bytes. + /// All the elements of value are converted. + /// + /// A String of hexadecimal pairs separated by hyphens, where each pair + /// represents the corresponding element in value; for example, "7F-2C-4A". + /// + public static string ToString(byte[] value) + { + return BitConverter.ToString(value); + } + + /// + /// Returns a String converted from the elements of a byte array starting at a specified array position. + /// + /// An array of bytes. + /// The starting position within value. + /// The elements from array position startIndex to the end of the array are converted. + /// + /// A String of hexadecimal pairs separated by hyphens, where each pair + /// represents the corresponding element in value; for example, "7F-2C-4A". + /// + public static string ToString(byte[] value, int startIndex) + { + return BitConverter.ToString(value, startIndex); + } + + /// + /// Returns a String converted from a specified number of bytes at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// The number of bytes to convert. + /// The length elements from array position startIndex are converted. + /// + /// A String of hexadecimal pairs separated by hyphens, where each pair + /// represents the corresponding element in value; for example, "7F-2C-4A". + /// + public static string ToString(byte[] value, int startIndex, int length) + { + return BitConverter.ToString(value, startIndex, length); + } + #endregion + + #region Decimal conversions + /// + /// Returns a decimal value converted from sixteen bytes + /// at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A decimal formed by sixteen bytes beginning at startIndex. + public decimal ToDecimal (byte[] value, int startIndex) + { + // HACK: This always assumes four parts, each in their own endianness, + // starting with the first part at the start of the byte array. + // On the other hand, there's no real format specified... + int[] parts = new int[4]; + for (int i=0; i < 4; i++) + { + parts[i] = ToInt32(value, startIndex+i*4); + } + return new Decimal(parts); + } + + /// + /// Returns the specified decimal value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 16. + public byte[] GetBytes(decimal value) + { + byte[] bytes = new byte[16]; + int[] parts = decimal.GetBits(value); + for (int i=0; i < 4; i++) + { + CopyBytesImpl(parts[i], 4, bytes, i*4); + } + return bytes; + } + + /// + /// Copies the specified decimal value into the specified byte array, + /// beginning at the specified index. + /// + /// A character to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(decimal value, byte[] buffer, int index) + { + int[] parts = decimal.GetBits(value); + for (int i=0; i < 4; i++) + { + CopyBytesImpl(parts[i], 4, buffer, i*4+index); + } + } + #endregion + + #region GetBytes conversions + /// + /// Returns an array with the given number of bytes formed + /// from the least significant bytes of the specified value. + /// This is used to implement the other GetBytes methods. + /// + /// The value to get bytes for + /// The number of significant bytes to return + byte[] GetBytes(long value, int bytes) + { + byte[] buffer = new byte[bytes]; + CopyBytes(value, bytes, buffer, 0); + return buffer; + } + + /// + /// Returns the specified Boolean value as an array of bytes. + /// + /// A Boolean value. + /// An array of bytes with length 1. + public byte[] GetBytes(bool value) + { + return BitConverter.GetBytes(value); + } + + /// + /// Returns the specified Unicode character value as an array of bytes. + /// + /// A character to convert. + /// An array of bytes with length 2. + public byte[] GetBytes(char value) + { + return GetBytes(value, 2); + } + + /// + /// Returns the specified double-precision floating point value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 8. + public byte[] GetBytes(double value) + { + return GetBytes(DoubleToInt64Bits(value), 8); + } + + /// + /// Returns the specified 16-bit signed integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 2. + public byte[] GetBytes(short value) + { + return GetBytes(value, 2); + } + + /// + /// Returns the specified 32-bit signed integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 4. + public byte[] GetBytes(int value) + { + return GetBytes(value, 4); + } + + /// + /// Returns the specified 64-bit signed integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 8. + public byte[] GetBytes(long value) + { + return GetBytes(value, 8); + } + + /// + /// Returns the specified single-precision floating point value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 4. + public byte[] GetBytes(float value) + { + return GetBytes(SingleToInt32Bits(value), 4); + } + + /// + /// Returns the specified 16-bit unsigned integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 2. + public byte[] GetBytes(ushort value) + { + return GetBytes(value, 2); + } + + /// + /// Returns the specified 32-bit unsigned integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 4. + public byte[] GetBytes(uint value) + { + return GetBytes(value, 4); + } + + /// + /// Returns the specified 64-bit unsigned integer value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 8. + public byte[] GetBytes(ulong value) + { + return GetBytes(unchecked((long)value), 8); + } + + #endregion + + #region CopyBytes conversions + /// + /// Copies the given number of bytes from the least-specific + /// end of the specified value into the specified byte array, beginning + /// at the specified index. + /// This is used to implement the other CopyBytes methods. + /// + /// The value to copy bytes for + /// The number of significant bytes to copy + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + void CopyBytes(long value, int bytes, byte[] buffer, int index) + { + if (buffer==null) + { + throw new ArgumentNullException("buffer", "Byte array must not be null"); + } + if (buffer.Length < index+bytes) + { + throw new ArgumentOutOfRangeException("Buffer not big enough for value"); + } + CopyBytesImpl(value, bytes, buffer, index); + } + + /// + /// Copies the given number of bytes from the least-specific + /// end of the specified value into the specified byte array, beginning + /// at the specified index. + /// This must be implemented in concrete derived classes, but the implementation + /// may assume that the value will fit into the buffer. + /// + /// The value to copy bytes for + /// The number of significant bytes to copy + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + protected abstract void CopyBytesImpl(long value, int bytes, byte[] buffer, int index); + + /// + /// Copies the specified Boolean value into the specified byte array, + /// beginning at the specified index. + /// + /// A Boolean value. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(bool value, byte[] buffer, int index) + { + CopyBytes(value ? 1 : 0, 1, buffer, index); + } + + /// + /// Copies the specified Unicode character value into the specified byte array, + /// beginning at the specified index. + /// + /// A character to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(char value, byte[] buffer, int index) + { + CopyBytes(value, 2, buffer, index); + } + + /// + /// Copies the specified double-precision floating point value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(double value, byte[] buffer, int index) + { + CopyBytes(DoubleToInt64Bits(value), 8, buffer, index); + } + + /// + /// Copies the specified 16-bit signed integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(short value, byte[] buffer, int index) + { + CopyBytes(value, 2, buffer, index); + } + + /// + /// Copies the specified 32-bit signed integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(int value, byte[] buffer, int index) + { + CopyBytes(value, 4, buffer, index); + } + + /// + /// Copies the specified 64-bit signed integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(long value, byte[] buffer, int index) + { + CopyBytes(value, 8, buffer, index); + } + + /// + /// Copies the specified single-precision floating point value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(float value, byte[] buffer, int index) + { + CopyBytes(SingleToInt32Bits(value), 4, buffer, index); + } + + /// + /// Copies the specified 16-bit unsigned integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(ushort value, byte[] buffer, int index) + { + CopyBytes(value, 2, buffer, index); + } + + /// + /// Copies the specified 32-bit unsigned integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(uint value, byte[] buffer, int index) + { + CopyBytes(value, 4, buffer, index); + } + + /// + /// Copies the specified 64-bit unsigned integer value into the specified byte array, + /// beginning at the specified index. + /// + /// The number to convert. + /// The byte array to copy the bytes into + /// The first index into the array to copy the bytes into + public void CopyBytes(ulong value, byte[] buffer, int index) + { + CopyBytes(unchecked((long)value), 8, buffer, index); + } + + #endregion + + #region Private struct used for Single/Int32 conversions + /// + /// Union used solely for the equivalent of DoubleToInt64Bits and vice versa. + /// + [StructLayout(LayoutKind.Explicit)] + struct Int32SingleUnion + { + /// + /// Int32 version of the value. + /// + [FieldOffset(0)] + int i; + /// + /// Single version of the value. + /// + [FieldOffset(0)] + float f; + + /// + /// Creates an instance representing the given integer. + /// + /// The integer value of the new instance. + internal Int32SingleUnion(int i) + { + this.f = 0; // Just to keep the compiler happy + this.i = i; + } + + /// + /// Creates an instance representing the given floating point number. + /// + /// The floating point value of the new instance. + internal Int32SingleUnion(float f) + { + this.i = 0; // Just to keep the compiler happy + this.f = f; + } + + /// + /// Returns the value of the instance as an integer. + /// + internal int AsInt32 + { + get { return i; } + } + + /// + /// Returns the value of the instance as a floating point number. + /// + internal float AsSingle + { + get { return f; } + } + } + #endregion + } +} \ No newline at end of file diff --git a/test/cs/Endianness.cs b/test/cs/Endianness.cs new file mode 100644 index 0000000..d8bd5e5 --- /dev/null +++ b/test/cs/Endianness.cs @@ -0,0 +1,17 @@ +namespace MiscUtil.Conversion +{ + /// + /// Endianness of a converter + /// + public enum Endianness + { + /// + /// Little endian - least significant byte first + /// + LittleEndian, + /// + /// Big endian - most significant byte first + /// + BigEndian + } +} \ No newline at end of file diff --git a/test/cs/LittleEndianBitConverter.cs b/test/cs/LittleEndianBitConverter.cs new file mode 100644 index 0000000..374bbb3 --- /dev/null +++ b/test/cs/LittleEndianBitConverter.cs @@ -0,0 +1,66 @@ + +namespace MiscUtil.Conversion +{ + /// + /// Implementation of EndianBitConverter which converts to/from little-endian + /// byte arrays. + /// + public sealed class LittleEndianBitConverter : EndianBitConverter + { + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + /// + /// Different computer architectures store data using different byte orders. "Big-endian" + /// means the most significant byte is on the left end of a word. "Little-endian" means the + /// most significant byte is on the right end of a word. + /// + /// true if this converter is little-endian, false otherwise. + public sealed override bool IsLittleEndian() + { + return true; + } + + /// + /// Indicates the byte order ("endianess") in which data is converted using this class. + /// + public sealed override Endianness Endianness + { + get { return Endianness.LittleEndian; } + } + + /// + /// Copies the specified number of bytes from value to buffer, starting at index. + /// + /// The value to copy + /// The number of bytes to copy + /// The buffer to copy the bytes into + /// The index to start at + protected override void CopyBytesImpl(long value, int bytes, byte[] buffer, int index) + { + for (int i=0; i < bytes; i++) + { + buffer[i+index] = unchecked((byte)(value&0xff)); + value = value >> 8; + } + } + + /// + /// Returns a value built from the specified number of bytes from the given buffer, + /// starting at index. + /// + /// The data in byte array format + /// The first index to use + /// The number of bytes to use + /// The value built from the given bytes + protected override long FromBytes(byte[] buffer, int startIndex, int bytesToConvert) + { + long ret = 0; + for (int i=0; i < bytesToConvert; i++) + { + ret = unchecked((ret << 8) | buffer[startIndex+bytesToConvert-1-i]); + } + return ret; + } + } +} \ No newline at end of file diff --git a/test/cs/ProtoTest.cs b/test/cs/ProtoTest.cs new file mode 100644 index 0000000..5adac72 --- /dev/null +++ b/test/cs/ProtoTest.cs @@ -0,0 +1,14 @@ +using GenProto; + +phoneNumber phoneNumber = new phoneNumber() +{ + number = new test { aa = "hello" }, + type = 100 +}; + +var data = phoneNumber.Serialize(); + +var ss = new phoneNumber(); +ss.Deserialize(data); + +Console.WriteLine("Hello, World!"); \ No newline at end of file diff --git a/test/protoMsg.cs b/test/cs/protoMsg.cs similarity index 100% rename from test/protoMsg.cs rename to test/cs/protoMsg.cs diff --git a/test/v1/protoMsg.erl b/test/erl/erlv1/protoMsg.erl similarity index 100% rename from test/v1/protoMsg.erl rename to test/erl/erlv1/protoMsg.erl diff --git a/test/v1/protoMsg.hrl b/test/erl/erlv1/protoMsg.hrl similarity index 100% rename from test/v1/protoMsg.hrl rename to test/erl/erlv1/protoMsg.hrl diff --git a/test/v1/test.erl b/test/erl/erlv1/protoTest.erl similarity index 99% rename from test/v1/test.erl rename to test/erl/erlv1/protoTest.erl index ba835cd..dcd8c13 100644 --- a/test/v1/test.erl +++ b/test/erl/erlv1/protoTest.erl @@ -1,4 +1,4 @@ --module(test). +-module(protoTest). -include("protoMsg.hrl"). -compile(export_all). diff --git a/test/start.bat b/test/erl/erlv1/start.bat similarity index 100% rename from test/start.bat rename to test/erl/erlv1/start.bat diff --git a/test/protoMsg.erl b/test/erl/protoMsg.erl similarity index 100% rename from test/protoMsg.erl rename to test/erl/protoMsg.erl diff --git a/test/protoMsg.hrl b/test/erl/protoMsg.hrl similarity index 100% rename from test/protoMsg.hrl rename to test/erl/protoMsg.hrl diff --git a/test/test.erl b/test/erl/protoTest.erl similarity index 99% rename from test/test.erl rename to test/erl/protoTest.erl index b5a13e1..0178d0d 100644 --- a/test/test.erl +++ b/test/erl/protoTest.erl @@ -1,6 +1,6 @@ --module(test). +-module(protoTest). --include("protoMsg.hrl"). +-include("../erl/protoMsg.hrl"). -compile(export_all). encode_int32(N) -> diff --git a/test/remake.bat b/test/erl/remake.bat similarity index 100% rename from test/remake.bat rename to test/erl/remake.bat diff --git a/test/remake.sh b/test/erl/remake.sh similarity index 100% rename from test/remake.sh rename to test/erl/remake.sh diff --git a/test/gen.bat b/test/gen.bat index ccae33e..88e804d 100644 --- a/test/gen.bat +++ b/test/gen.bat @@ -1 +1 @@ -genProto ../proto ./ ./ +genProto ../proto erl ./erl ./erl lua ./lua cs ./cs diff --git a/test/gen.sh b/test/gen.sh index ccae33e..88e804d 100644 --- a/test/gen.sh +++ b/test/gen.sh @@ -1 +1 @@ -genProto ../proto ./ ./ +genProto ../proto erl ./erl ./erl lua ./lua cs ./cs diff --git a/test/genProto b/test/genProto deleted file mode 100644 index 6f34fff0ec5f4fa1f1abecde493346d80eebe981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105022 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 z 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 mz~w)hM)lGDu=}6Y{U^>vM;#0MACD8= mPos, string.format("End of file was encountered. pos: %d, length: %d.", mPos, #mBuf)) + end + -- 获取字符码 + local function getLetterCode(fmt) + fmt = fmt or "" + return ">"..fmt + end + -- 读单个字节 + local function readRawByte() + checkAvailable() + local rawByte = mBuf[mPos] + mPos = mPos + 1 + return rawByte + end + -- 写单个字节 + local function writeRawByte(rawByte) + if mPos > #mBuf + 1 then + for i=#mBuf + 1, mPos - 1 do + mBuf[i] = string.char(0) + end + end + mBuf[mPos] = rawByte + mPos = mPos + 1 + end + -- 读字节流 + local function readBuf(length) + checkAvailable() + local buf = table.concat(mBuf, "", mPos, mPos + length - 1) + mPos = mPos + length + return buf + end + -- 写字节流 + local function writeBuf(buf) + for i=1, #buf do + writeRawByte(buf:sub(i, i)) + end + end + -- 读字符串 + local function read_string_bytes(length) + if 0 == length then + return "" + end + local tmp, value = string.unpack(readBuf(length), getLetterCode("A"..length)) + return value + end + -- 写字符串 + local function write_string_bytes(value) + local buf = string.pack(getLetterCode("A"), value) + writeBuf(buf) + end + ---------------------------------------------------------------------- + -- public method + ---------------------------------------------------------------------- + local ba = {} + -- 设置字节流 + ba.setBytes = function(buf) + if #mBuf > 0 then + return + end + writeBuf(buf) + mPos = 1 -- 这里必须重置读写位置为1,方能保证接下去的读操作正确 + end + -- 获取字节流 + ba.getBytes = function() + local bytes = {} + for i=1, #mBuf do + bytes[#bytes+1] = string.byte(mBuf[i]) + end + local packRes = string.pack(getLetterCode("b"..#bytes), unpack(bytes)) + return packRes + end + -- 获取字节流长度 + ba.getLength = function() + return #mBuf + end + -- 字节流转为字符串,radix-8,10,16 + ba.toString = function(radix, separator) + radix = radix or 16 + radix = mRadix[radix] or "%02X" + separator = separator or " " + local bytes = {} + for i=1, #mBuf do + bytes[i] = string.format(radix..separator, string.byte(mBuf[i])) + end + return table.concat(bytes) + end + ---------------------------------------------------------------------- + -- 读16位整型 + ba.read_int16 = function() + local tmp, value = string.unpack(readBuf(2), getLetterCode("h")) + return value + end + -- 写16位整型 + ba.write_int16 = function(value) + local buf = string.pack(getLetterCode("h"), value) + writeBuf(buf) + end + -- 读16位无符号整型 + ba.read_uint16 = function() + local tmp, value = string.unpack(readBuf(2), getLetterCode("H")) + return value + end + -- 写16位无符号整型 + ba.write_uint16 = function(value) + local sstr = getLetterCode("H") + local buf = string.pack(sstr, value) + writeBuf(buf) + end + -- 读32位整型 + ba.read_int32 = function() + local tmp, value = string.unpack(readBuf(4), getLetterCode("i")) + return value + end + -- 写32位整型 + ba.write_int32 = function(value) + local buf = string.pack(getLetterCode("i"), value) + writeBuf(buf) + end + -- 读32位无符号整型 + ba.read_uint32 = function() + local tmp, value = string.unpack(readBuf(4), getLetterCode("I")) + return value + end + -- 写32位无符号整型 + ba.write_uint32 = function(value) + local buf = string.pack(getLetterCode("I"), value) + writeBuf(buf) + end + -- 读长整型 + ba.read_long = function() + local tmp, value = string.unpack(readBuf(4), getLetterCode("l")) + return value + end + -- 写长整型 + ba.write_long = function(value) + local buf = string.pack(getLetterCode("l"), value) + writeBuf(buf) + end + -- 读无符号长整型 + ba.read_ulong = function() + local tmp, value = string.unpack(readBuf(4), getLetterCode("L")) + return value + end + -- 写无符号长整型 + ba.write_ulong = function(value) + local buf = string.pack(getLetterCode("L"), value) + writeBuf(buf) + end + -- 读64位整型 + ba.read_int64 = function() + -- local tmp, value = string.unpack(readBuf(8), getLetterCode("m")) + -- return value + return read_string_bytes(8) + end + -- 写64位整型 + ba.write_int64 = function(value) + -- local buf = string.pack(getLetterCode("m"), value) + -- writeBuf(buf) + local buf = string.pack(getLetterCode("A"), value) + writeBuf(buf) + end + -- 读64位无符号整型 + ba.read_uint64 = function() + -- local tmp, value = string.unpack(readBuf(8), getLetterCode("M")) + -- return value + return read_string_bytes(8) + end + -- 写64位无符号整型 + ba.write_uint64 = function(value) + -- local buf = string.pack(getLetterCode("M"), value) + -- writeBuf(buf) + local buf = string.pack(getLetterCode("A"), value) + writeBuf(buf) + end + -- 读单精度浮点型 + ba.read_float = function() + local tmp, value = string.unpack(readBuf(4), getLetterCode("f")) + return value + end + -- 写单精度浮点型 + ba.write_float = function(value) + local buf = string.pack(getLetterCode("f"), value) + writeBuf(buf) + end + -- 读双精度浮点型 + ba.read_double = function() + local tmp, value = string.unpack(readBuf(8), getLetterCode("d")) + return value + end + -- 写双精度浮点型 + ba.write_double = function(value) + local buf = string.pack(getLetterCode("d"), value) + writeBuf(buf) + end + -- 读布尔型 + ba.read_bool = function() + return 1 == read_char() + end + -- 写布尔型 + ba.write_bool = function(value) + if value then + ba.write_char(1) + else + ba.write_char(0) + end + end + -- 读字符型 + ba.read_int8 = function() + local tmp, value = string.unpack(readRawByte(), "c") + return value + end + -- 写字符型 + ba.write_int8 = function(value) + writeRawByte(string.pack("c", value)) + end + -- 读单字节 + ba.read_uint8 = function() + -- 方法1 + -- return string.byte(readRawByte()) + -- 方法2 + local tmp, value = string.unpack(readRawByte(), "b") + return value + end + -- 写单字节 + ba.write_uint8 = function(value) + -- 方法1 + -- writeRawByte(string.char(value)) + -- 方法2 + writeRawByte(string.pack("b", value)) + end + -- 读字符串 + ba.read_string = function() + local length = ba.read_uint16() + return read_string_bytes(length) + end + -- 写字符串 + ba.write_string = function(value) + local buf = string.pack(getLetterCode("A"), value) + ba.write_uint16(#buf) + writeBuf(buf) + end + ---------------------------------------------------------------------- + return ba +end + diff --git a/src/writeLua/ByteArray.lua b/test/lua/ByteArray_back.lua similarity index 100% rename from src/writeLua/ByteArray.lua rename to test/lua/ByteArray_back.lua diff --git a/test/protoMsg.lua b/test/lua/protoMsg.lua similarity index 100% rename from test/protoMsg.lua rename to test/lua/protoMsg.lua diff --git a/test/protoName.lua b/test/lua/protoName.lua similarity index 100% rename from test/protoName.lua rename to test/lua/protoName.lua diff --git a/test/lua/protoTest.lua b/test/lua/protoTest.lua new file mode 100644 index 0000000..c13cdc3 --- /dev/null +++ b/test/lua/protoTest.lua @@ -0,0 +1,19 @@ +function test() + -- 封包 + + local msgTable = new phoneNumber() + msgTable.number = new test() + msgTable.type = 1 + local byteArray = ByteArray() + byteArray = msgTable.build(byteArray) + local body = byteArray.getBytes() + -- 包头(大小端转换后的包体长度) + local bodyLength = string.len(body) -- 包体长度 + local head = string.pack(">I4", bodyLength) -- 包头四个字节,这里要用"i" + -- 发送 + local nSend = dosend(head..body) + + -- 解包 先读取消息id 根据消息id到protoNane.lua 获取函数名 + -- 再根据函数名到 _G表找到反序列化的函数 + +end \ No newline at end of file diff --git a/test/v1/start.bat b/test/v1/start.bat deleted file mode 100644 index 59d0635..0000000 --- a/test/v1/start.bat +++ /dev/null @@ -1 +0,0 @@ -start werl.exe \ No newline at end of file