コード例 #1
0
        public static int WritePackedLength(this Span <byte> bytes, long len)
        {
            if (len < 0 || (ulong)len >= 0xC000000000000000UL)
            {
                ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(len));
            }

            if (len > 0x3FFFFFFF)
            {
                BinaryPrimitives.WriteUInt64BigEndian(bytes, unchecked ((ulong)len | 0xC000000000000000UL));
                return(sizeof(ulong));
            }

            if (len > 0x3FFF)
            {
                BinaryPrimitives.WriteUInt32BigEndian(bytes, unchecked ((uint)len | 0x80000000U));
                return(sizeof(uint));
            }

            if (len > 0x3F)
            {
                BinaryPrimitives.WriteUInt16BigEndian(bytes, unchecked ((ushort)(len | 0x4000)));
                return(sizeof(ushort));
            }

            bytes[0] = unchecked ((byte)len);
            return(sizeof(byte));
        }
コード例 #2
0
        public sbyte Deserialize(Stream stream)
        {
            var rv = stream.ReadByte();

            if (rv < 0)
            {
                ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(stream));
            }

            return(unchecked ((sbyte)rv));
        }
コード例 #3
0
        public bool Deserialize(Stream stream)
        {
            var rv = stream.ReadByte();

            if (rv < 0)
            {
                ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(stream));
            }

            return(rv != 0);
        }
コード例 #4
0
        public byte[] Serialize(byte[] obj)
        {
            if (obj == null)
            {
                ThrowHelpers.ThrowArgumentNullException(nameof(obj));
            }

            // ReSharper disable once PossibleNullReferenceException
#pragma warning disable CS8602 // Dereference of a possibly null reference.
            if (obj.Length != Size)
            {
#pragma warning restore CS8602 // Dereference of a possibly null reference.
                ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(obj));
            }

            return(obj.AsSpan().ToArray());
        }
コード例 #5
0
        public byte[] Serialize(T[] obj)
        {
            if (obj == null)
            {
                ThrowHelpers.ThrowArgumentNullException(nameof(obj));
            }

            // ReSharper disable once PossibleNullReferenceException
#pragma warning disable CS8602 // Dereference of a possibly null reference.
            if (obj.Length == 0)
            {
#pragma warning restore CS8602 // Dereference of a possibly null reference.
                return(new byte[1]);
            }

            using var ms = new MemoryStream();
            ms.WritePackedLength(obj.Length);
            var underlyingSize = underlying.Size;
            if (underlyingSize > 0)
            {
                foreach (var o in obj.Select(e => underlying.Serialize(e)))
                {
                    if (o.Length != underlyingSize)
                    {
                        ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(obj));
                    }

                    ms.Write(o, 0, underlyingSize);
                }
            }
            else
            {
                foreach (var o in obj.Select(e => underlying.Serialize(e)))
                {
                    ms.WritePackedLength(o.Length);
                    if (o.Length > 0)
                    {
                        ms.Write(o, 0, o.Length);
                    }
                }
            }

            return(ms.ToArray());
        }
コード例 #6
0
        public static int WritePackedLength(this Stream stream, long len)
        {
            if (len < 0 || (ulong)len >= 0xC000000000000000UL)
            {
                ThrowHelpers.ThrowArgumentOutOfRangeException(nameof(len));
            }

            Span <byte> lenBuf = stackalloc byte[sizeof(long)];

            lenBuf = lenBuf.Slice(0, WritePackedLength(lenBuf, len));
#if NETSTANDARD2_1
            stream.Write(lenBuf);
#else
            foreach (var b in lenBuf)
            {
                stream.WriteByte(b);
            }
#endif
            return(lenBuf.Length);
        }