コード例 #1
0
        public IDjmainArchive Decode(IDjmainChunk chunk, DjmainDecodeOptions options)
        {
            if (chunk.Data.Length != 0x1000000)
            {
                throw new RhythmCodexException("Chunk length must be exactly 16mb (0x1000000 bytes)");
            }

            if (chunk.Format == DjmainChunkFormat.Unknown ||
                !Enum.IsDefined(typeof(DjmainChunkFormat), chunk.Format))
            {
                throw new RhythmCodexException($"{nameof(chunk.Format)} is not recognized");
            }

            using (var stream = new ReadOnlyMemoryStream(chunk.Data))
            {
                var swappedStream = new ByteSwappedReadStream(stream);

                var chartSoundMap = _offsetProvider.GetSampleChartMap(chunk.Format)
                                    .Select((offset, index) => new KeyValuePair <int, int>(index, offset))
                                    .ToDictionary(kv => kv.Key, kv => kv.Value);
                var rawCharts     = ExtractCharts(stream, chunk.Format).Where(c => c.Value != null).ToList();
                var decodedCharts = DecodeCharts(rawCharts, chartSoundMap, chunk.Format);
                var sounds        = options.DisableAudio
                    ? null
                    : DecodeSounds(swappedStream, chunk.Format, chartSoundMap, rawCharts, decodedCharts, options)
                                    .ToDictionary(kv => kv.Key, kv => kv.Value.Select(s => s));

                return(new DjmainArchive
                {
                    RawCharts = rawCharts.ToDictionary(kv => kv.Key, kv => kv.Value),
                    Charts = decodedCharts?.Select(c => c.Value).ToList(),
                    Samples = sounds?.SelectMany(s => s.Value).Select(s => s.Value).ToList()
                });
            }
        }
コード例 #2
0
        public SsqInfoChunk Decode(SsqChunk ssqChunk)
        {
            var text     = new string[12];
            var chunkMem = new ReadOnlyMemoryStream(ssqChunk.Data);
            var reader   = new BinaryReader(chunkMem, Encodings.CP1252);
            var builder  = new StringBuilder();

            for (var i = 0; i < text.Length; i++)
            {
                while (true)
                {
                    var c = reader.ReadChar();
                    if (c == 0)
                    {
                        break;
                    }
                    builder.Append(c);
                }

                text[i] = builder.ToString();
                builder.Clear();
            }

            return(new SsqInfoChunk
            {
                Text = text,
                Difficulties = reader.ReadBytes(10)
            });
        }
コード例 #3
0
        private IEnumerable <Step> ConvertInternal(byte[] data)
        {
            using (var mem = new ReadOnlyMemoryStream(data))
                using (var reader = new BinaryReader(mem))
                {
                    // skip metadata
                    reader.ReadInt32();

                    while (mem.Position < mem.Length - 7)
                    {
                        var metricOffset = reader.ReadInt32();
                        var rawPanels    = reader.ReadInt32();
                        if (rawPanels == -1 || rawPanels == 0)
                        {
                            continue;
                        }

                        yield return(new Step
                        {
                            MetricOffset = metricOffset,
                            Panels = unchecked ((byte)CollapsePanels(rawPanels))
                        });
                    }
                }
        }
コード例 #4
0
ファイル: XaDecoder.cs プロジェクト: SaxxonPike/RhythmCodex
        public IList <ISound> Decode(XaChunk chunk)
        {
            var sounds   = new List <ISound>();
            var buffer   = new float[28];
            var channels = 2;

            var states  = Enumerable.Range(0, channels).Select(i => new XaState()).ToList();
            var samples = Enumerable.Range(0, channels).Select(i => new List <float>()).ToList();

            using (var mem = new ReadOnlyMemoryStream(chunk.Data))
                using (var reader = new BinaryReader(mem))
                {
                    for (var offset = 0; offset < mem.Length - 0x7F; offset += 0x80)
                    {
                        var frame = reader.ReadBytes(0x80);
                        for (var c = 0; c < 8; c++)
                        {
                            DecodeFrame(frame, buffer, c, states[c % channels]);
                            samples[c % channels].AddRange(buffer);
                        }
                    }
                }

            sounds.Add(new Sound
            {
                Samples = samples.Select(s => new Sample {
                    Data = s
                }).Cast <ISample>().ToList()
            });

            return(sounds);
        }
コード例 #5
0
        private static void ParseTileAreaNode(OTBNode tileAreaNode, World world)
        {
            if (tileAreaNode == null)
            {
                throw new ArgumentNullException(nameof(tileAreaNode));
            }
            if (tileAreaNode.Type != OTBNodeType.TileArea)
            {
                throw new TFSWorldLoadingException();
            }

            var stream = new ReadOnlyMemoryStream(tileAreaNode.Data.Span);

            var areaStartX = stream.ReadUInt16();
            var areaStartY = stream.ReadUInt16();
            var areaZ      = stream.ReadByte();

            var areaStartPosition = new Coordinate(
                x: areaStartX,
                y: areaStartY,
                z: (sbyte)areaZ);

            foreach (var tileNode in tileAreaNode.Children)
            {
                ParseTileNode(
                    tilesAreaStartPosition: areaStartPosition,
                    tileNode: tileNode,
                    world: world);
            }
        }
コード例 #6
0
        public Step2Chunk Read(Stream stream, int length)
        {
            var data = new BinaryReader(stream).ReadBytes(length);

            using (var mem = new ReadOnlyMemoryStream(data))
                using (var reader = new BinaryReader(mem))
                {
                    var headerLength = reader.ReadInt32();
                    if (headerLength < 4 || (headerLength & 3) != 0 || (headerLength - 4) % 0x14 != 0)
                    {
                        throw new RhythmCodexException("Incorrect Step2 header.");
                    }

                    var metadataCount = (headerLength - 4) / 0x14;
                    var metadatas     = new List <Step2Metadata>();
                    for (var i = 0; i < metadataCount; i++)
                    {
                        metadatas.Add(new Step2Metadata
                        {
                            Offset   = reader.ReadInt32() - headerLength,
                            Length   = reader.ReadInt32() * 4,
                            Reserved = reader.ReadInt32(),
                            Next1P   = (reader.ReadInt32() - 4) / 0x14,
                            Next2P   = (reader.ReadInt32() - 4) / 0x14
                        });
                    }

                    return(new Step2Chunk
                    {
                        Metadatas = metadatas,
                        Data = reader.ReadBytes(length - headerLength)
                    });
                }
        }
コード例 #7
0
        public async Task ValidatesReadArguments()
        {
            var buffer = Encoding.UTF8.GetBytes("some data");
            var stream = new ReadOnlyMemoryStream(buffer);

            stream.Seek(3, SeekOrigin.Begin);
            var read = new byte[buffer.Length - stream.Position];

            Assert.That(
                async() => await stream.ReadAsync(read, 0, buffer.Length),
                Throws.InstanceOf <ArgumentException>());
            Assert.That(
                async() => await stream.ReadAsync(null, 0, buffer.Length),
                Throws.InstanceOf <ArgumentException>());
            Assert.That(
                async() => await stream.ReadAsync(read, -1, read.Length),
                Throws.InstanceOf <ArgumentException>());
            Assert.That(
                async() => await stream.ReadAsync(read, 0, -1),
                Throws.InstanceOf <ArgumentException>());
            await stream.ReadAsync(read, 0, read.Length);

            Assert.AreEqual(
                new ReadOnlyMemory <byte>(buffer, 3, buffer.Length - 3).ToArray(),
                read);
        }
コード例 #8
0
        public void ReadByte_Throws_AfterReadingEntireBuffer(
            [Values(10)] int bufferLength,
            [Values(5)] int startPosition,
            [Values(5)] int bytesToRead
            )
        {
            // Working around the ref struct constraints
            var reachedThrowLine = false;

            Assert.Throws <InvalidOperationException>(() => {
                var stream = new ReadOnlyMemoryStream(
                    buffer: new byte[bufferLength],
                    position: startPosition);

                for (int i = 0; i < bytesToRead; i++)
                {
                    stream.ReadByte();
                }

                reachedThrowLine = true;
                stream.ReadByte();
            });


            Assert.True(reachedThrowLine);
        }
コード例 #9
0
ファイル: ExtensionMethods.cs プロジェクト: DanilovSoft/vRPC
 internal static void SerializeObjectProtobuf(ArrayBufferWriter <byte> destination, object instance)
 {
     using (var mem = new ReadOnlyMemoryStream(destination.WrittenMemory))
     {
         ProtoBuf.Serializer.Serialize(mem, instance);
     }
 }
コード例 #10
0
        private IEnumerable <KeyValuePair <int, IDjmainSampleInfo> > ReadInternal(Stream stream)
        {
            var buffer = new byte[11];

            using (var mem = new ReadOnlyMemoryStream(buffer))
            {
                var reader = new BinaryReader(mem);

                for (var i = 0; i < _djmainConfiguration.MaxSampleDefinitions; i++)
                {
                    reader.BaseStream.Position = 0;

                    var bytesRead = stream.Read(buffer, 0, 11);
                    if (bytesRead < 11)
                    {
                        yield break;
                    }

                    var result = new DjmainSampleInfo
                    {
                        Channel      = reader.ReadByte(),
                        Frequency    = reader.ReadUInt16(),
                        ReverbVolume = reader.ReadByte(),
                        Volume       = reader.ReadByte(),
                        Panning      = reader.ReadByte(),
                        Offset       = reader.ReadUInt16() | ((uint)reader.ReadByte() << 16),
                        SampleType   = reader.ReadByte(),
                        Flags        = reader.ReadByte()
                    };
                    yield return(new KeyValuePair <int, IDjmainSampleInfo>(i, result));
                }
            }
        }
コード例 #11
0
        public ISound Decode(BeatmaniaPcAudioEntry entry)
        {
            using (var wavDataMem = new ReadOnlyMemoryStream(entry.Data))
            {
                var result = _wavDecoder.Decode(wavDataMem);

                var panning = entry.Panning;
                if (panning > 0x7F || panning < 0x01)
                {
                    panning = 0x40;
                }

                var volume = entry.Volume;
                if (volume < 0x01)
                {
                    volume = 0x01;
                }
                else if (volume > 0xFF)
                {
                    volume = 0xFF;
                }

                result[NumericData.Panning]       = (panning - 1.0d) / 126.0d;
                result[NumericData.Volume]        = BeatmaniaPcConstants.VolumeTable[volume];
                result[NumericData.Channel]       = entry.Channel;
                result[NumericData.SourceVolume]  = entry.Volume;
                result[NumericData.SourcePanning] = entry.Panning;

                return(result);
            }
        }
コード例 #12
0
        public static uint ReadUInt32(ReadOnlyMemoryStream input)
        {
            int result = 0;
            int offset = 0;

            for (; offset < 32; offset += 7)
            {
                int b = input.ReadByte();
                if (b == -1)
                {
                    throw Truncated;
                }

                result |= (b & 0x7f) << offset;
                if ((b & 0x80) == 0)
                {
                    return((uint)result);
                }
            }
            // keep reading up to 64 bits
            for (; offset < 64; offset += 7)
            {
                int b = input.ReadByte();
                if (b == -1)
                {
                    throw Truncated;
                }
                if ((b & 0x80) == 0)
                {
                    return((uint)result);
                }
            }
            throw Malformed;
        }
コード例 #13
0
        private void ExtractTree()
        {
            var stream = new ReadOnlyMemoryStream(_serializedTreeData);

            stream.Skip(4);             // Skip indentifier
            while (!stream.IsOver)
            {
                var currentMark = (OTBMarkupByte)stream.ReadByte();
                if (currentMark < OTBMarkupByte.Escape)
                {
                    // What is under Escape = 0xFD is just prop data. Just skip
                    continue;
                }

                switch (currentMark)
                {
                case OTBMarkupByte.Start:
                    var nodeType = (OTBNodeType)stream.ReadByte();
                    AddNodeBegin(stream.Position, nodeType);
                    break;

                case OTBMarkupByte.End:
                    AddNodeEnd(stream.Position);
                    break;

                case OTBMarkupByte.Escape:
                    stream.Skip();
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }
        }
コード例 #14
0
        public IList <Timing> Convert(ReadOnlyMemory <byte> data)
        {
            using (var mem = new ReadOnlyMemoryStream(data))
                using (var reader = new BinaryReader(mem))
                {
                    var count = reader.ReadInt32();

                    var metricOffsets = Enumerable
                                        .Range(0, count)
                                        .Select(i => reader.ReadInt32())
                                        .ToArray();

                    var linearOffsets = Enumerable
                                        .Range(0, count)
                                        .Select(i => reader.ReadInt32())
                                        .ToArray();

                    return(Enumerable
                           .Range(0, count)
                           .Select(i => new Timing
                    {
                        LinearOffset = linearOffsets[i],
                        MetricOffset = metricOffsets[i]
                    })
                           .AsList());
                }
        }
コード例 #15
0
        public byte[] Decrypt(Stream source, long length)
        {
            if (length < 4)
            {
                throw new RhythmCodexException($"{nameof(length)} must be at least 4.");
            }

            var reader = new BinaryReader(source);

            byte[] key;
            BeatmaniaPcAudioEncryptionType encType;
            var headerChars = reader.ReadChars(4);
            var headerId    = new string(headerChars);

            switch (headerId)
            {
            case @"%eNc":
                key     = EncryptionKey9;
                encType = BeatmaniaPcAudioEncryptionType.Standard;
                break;

            case @"%e10":
                key     = EncryptionKey10;
                encType = BeatmaniaPcAudioEncryptionType.Standard;
                break;

            case @"%e11":
                key     = EncryptionKey11;
                encType = BeatmaniaPcAudioEncryptionType.Standard;
                break;

            case @"%e12":
                key     = EncryptionKey11;
                encType = BeatmaniaPcAudioEncryptionType.Partial;
                break;

            case @"%hid":
                key     = EncryptionKey11;
                encType = BeatmaniaPcAudioEncryptionType.Partial;
                break;

            case @"%iO0":
                key     = EncryptionKey16;
                encType = BeatmaniaPcAudioEncryptionType.Standard;
                break;

            default:
                return(source.TryRead(4, (int)(length - 4)));
            }

            {
                var filelength     = reader.ReadInt32();
                var fileExtraBytes = (8 - (filelength % 8)) % 8;
                var data           = reader.ReadBytes(filelength + fileExtraBytes);
                reader.ReadBytes((int)(length - data.Length - 8));
                using (var encodedDataMem = new ReadOnlyMemoryStream(data))
                    return(DecryptInternal(encodedDataMem, key, encType, data.Length));
            }
        }
コード例 #16
0
        public OTBParsingStream(ReadOnlySpan <byte> otbData)
        {
            UnderlayingStream = new ReadOnlyMemoryStream(otbData);

            // The buffer must be at least as big as the largest non-string
            // object we can parse. Currently it's a uint32.
            _parsingBuffer = new byte[sizeof(UInt32)];
        }
コード例 #17
0
 public int[] Decode8Bit(byte[] data, int stride, int height)
 {
     using (var stream = new ReadOnlyMemoryStream(data))
         using (var reader = new BinaryReader(stream))
         {
             var size = height * stride;
             return(reader.ReadBytes(size).Select(b => (int)b).ToArray());
         }
 }
コード例 #18
0
        protected override void CreateInternal(ReadOnlyMemory <byte> data)
        {
            Materials = new List <MeshMaterial>();

            // Read the file.
            // todo: Use spans instead of splits.
            // https://en.wikipedia.org/wiki/Wavefront_.obj_file
            var          stream          = new ReadOnlyMemoryStream(data);
            var          reader          = new StreamReader(stream);
            MeshMaterial currentMaterial = null;

            while (!reader.EndOfStream)
            {
                string currentLine = reader.ReadLine();
                if (string.IsNullOrEmpty(currentLine))
                {
                    continue;
                }
                currentLine = currentLine.Trim();
                if (currentLine == "" || currentLine[0] == '#')
                {
                    continue;                                             // Comment
                }
                string[] args       = Regex.Replace(currentLine, @"\s+", " ").Split(' ');
                string   identifier = args[0];

                switch (identifier)
                {
                case "newmtl":
                {
                    var newMat = new MeshMaterial
                    {
                        Name = args[1]
                    };
                    currentMaterial = newMat;
                    Materials.Add(newMat);
                    break;
                }

                case "map_Kd" when currentMaterial != null:
                {
                    string directory   = AssetLoader.GetDirectoryName(Name);
                    string texturePath = AssetLoader.GetNonRelativePath(directory, AssetLoader.NameToEngineName(args[1]));
                    var    texture     = Engine.AssetLoader.Get <TextureAsset>(texturePath);
                    if (texture != null)
                    {
                        texture.Texture.Tile               = true;
                        texture.Texture.Smooth             = true;
                        currentMaterial.DiffuseTextureName = texturePath;
                        currentMaterial.DiffuseTexture     = texture.Texture;
                    }

                    break;
                }
                }
            }
        }
コード例 #19
0
        public void BytesLeftToRead_ReturnsCorrectValueAfter_ReadByte()
        {
            var stream = new ReadOnlyMemoryStream(buffer: new byte[10]);

            var oldLeft = stream.BytesLeftToRead;

            stream.ReadByte();
            var newLeft = stream.BytesLeftToRead;

            Assert.True(oldLeft - newLeft == 1);
        }
コード例 #20
0
        public void ValidatesPositionValue()
        {
            var buffer = Encoding.UTF8.GetBytes("some data");
            var stream = new ReadOnlyMemoryStream(buffer);

            Assert.That(
                () => stream.Position = -1,
                Throws.InstanceOf <ArgumentException>());
            Assert.That(
                () => stream.Position = (long)int.MaxValue + 1,
                Throws.InstanceOf <ArgumentException>());
        }
コード例 #21
0
        public void BytesLeftToRead_ReturnsCorrectValueAfter_Constructor(
            [Values(0, 1, 1, 2, 2)] int bufferLength,
            [Values(0, 0, 1, 0, 2)] int startPosition,
            [Values(0, 1, 0, 2, 0)] int bytesLeft
            )
        {
            var stream = new ReadOnlyMemoryStream(
                buffer: new byte[bufferLength],
                position: startPosition);

            Assert.AreEqual(
                expected: bytesLeft,
                actual: stream.BytesLeftToRead);
        }
コード例 #22
0
 public int[] Decode16Bit(byte[] data, int stride, int height)
 {
     using (var stream = new ReadOnlyMemoryStream(data))
         using (var reader = new BinaryReader(stream))
         {
             var size   = height * stride / 2;
             var result = new int[size];
             for (var i = 0; i < size; i++)
             {
                 result[i] = reader.ReadUInt16();
             }
             return(result);
         }
 }
コード例 #23
0
 private IEnumerable <Timing> ConvertInternal(byte[] data)
 {
     using (var mem = new ReadOnlyMemoryStream(data))
         using (var reader = new BinaryReader(mem))
         {
             while (mem.Position < mem.Length - 7)
             {
                 yield return(new Timing
                 {
                     MetricOffset = reader.ReadInt32(),
                     LinearOffset = reader.ReadInt32()
                 });
             }
         }
 }
コード例 #24
0
 public int[] Decode24Bit(byte[] data, int stride, int height)
 {
     using (var stream = new ReadOnlyMemoryStream(data))
         using (var reader = new BinaryReader(stream))
         {
             var size   = height * stride / 3;
             var result = new int[size];
             for (var i = 0; i < size; i++)
             {
                 var pixels = reader.ReadBytes(3);
                 result[i] = pixels[0] | (pixels[1] << 8) | (pixels[2] << 16);
             }
             return(result);
         }
 }
コード例 #25
0
        public static byte[] Decode(ReadOnlyMemory <byte> fileData, out ImgBinFileHeader fileHeader)
        {
            fileHeader = new ImgBinFileHeader();

            var stream = new ReadOnlyMemoryStream(fileData);

            using var r = new BinaryReader(stream);
            r.ReadChars(3); // Header
            float width  = r.ReadSingle();
            float height = r.ReadSingle();

            fileHeader.Size   = new Vector2(width, height);
            fileHeader.Format = (PixelFormat)r.ReadInt32();
            return(fileData.Span.Slice((int)stream.Position).ToArray());
        }
コード例 #26
0
        public async Task CanRead()
        {
            var buffer = Encoding.UTF8.GetBytes("some data");
            var stream = new ReadOnlyMemoryStream(buffer);

            var read = new byte[buffer.Length];

            stream.Read(read, 0, buffer.Length);
            Assert.AreEqual(buffer, read);

            read            = new byte[buffer.Length];
            stream.Position = 0;
            await stream.ReadAsync(read, 0, buffer.Length);

            Assert.AreEqual(buffer, read);
        }
コード例 #27
0
ファイル: OTBDeserializer.cs プロジェクト: Mun1z/CoreOpenMMO
        /// <summary>
        /// Parses data serialized as .otb and returns the deserialized .otb tree structure.
        /// </summary>
        /// <remarks>
        /// Beware that some .otb serializers add a "format identifier" before the data.
        /// Maps (worlds?), for instance, contain 4 "format identifier bytes" that should be skiped.
        /// </remarks>
        public static OTBNode DeserializeOTBData(ReadOnlyMemory <byte> serializedOTBData, int skipFirstBytes)
        {
            if (skipFirstBytes < 0)
            {
                throw new ArgumentOutOfRangeException();
            }

            var relevantData = serializedOTBData.Slice(skipFirstBytes);
            var stream       = new ReadOnlyMemoryStream(serializedOTBData);

            var treeBuilder = new OTBTreeBuilder(serializedOTBData);

            while (!stream.IsOver)
            {
                var currentMark = (OTBMarkupByte)stream.ReadByte();
                if (currentMark < OTBMarkupByte.Escape)
                {
                    // Since <see cref="OTBMarkupByte"/> can only have values Escape (0xFD), Start (0xFE) and
                    // End (0xFF), if currentMark < Escape, then it's just prop data
                    // and we can safely skip it.
                    continue;
                }

                switch (currentMark)
                {
                case OTBMarkupByte.Start:
                    var nodeType = (OTBNodeType)stream.ReadByte();
                    treeBuilder.AddNodeDataBegin(
                        start: stream.Position,
                        type: nodeType);
                    break;

                case OTBMarkupByte.End:
                    treeBuilder.AddNodeEnd(stream.Position - 1);
                    break;

                case OTBMarkupByte.Escape:
                    stream.Skip();
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }

            return(treeBuilder.BuildTree());
        }
コード例 #28
0
        private static void ParseOTBTreeRootNode(OTBNode rootNode, World world)
        {
            if (rootNode == null)
            {
                throw new ArgumentNullException(nameof(rootNode));
            }
            if (world == null)
            {
                throw new ArgumentNullException(nameof(world));
            }
            if (rootNode.Children.Count != 1)
            {
                throw new TFSWorldLoadingException();
            }

            var parsingStream = new ReadOnlyMemoryStream(rootNode.Data.Span);             //new OTBParsingStream(rootNode.Data.Span);

            var headerVersion = parsingStream.ReadUInt32();

            if (headerVersion == 0 || headerVersion > 2)
            {
                throw new TFSWorldLoadingException();
            }

            var worldWidth  = parsingStream.ReadUInt16();
            var worldHeight = parsingStream.ReadUInt16();

            var itemEncodingMajorVersion = parsingStream.ReadUInt32();

            if (itemEncodingMajorVersion != SupportedItemEncodingMajorVersion)
            {
                throw new TFSWorldLoadingException();
            }

            var itemEncodingMinorVersion = parsingStream.ReadUInt32();

            if (itemEncodingMinorVersion < SupportedItemEncodingMinorVersion)
            {
                throw new TFSWorldLoadingException();
            }

            Console.WriteLine($"OTBM header version: {headerVersion}");
            Console.WriteLine($"World width: {worldWidth}");
            Console.WriteLine($"World height: {worldHeight}");
            Console.WriteLine($"Item encoding major version: {itemEncodingMajorVersion}");
            Console.WriteLine($"Item encoding minor version: {itemEncodingMinorVersion}");
        }
コード例 #29
0
 public IRiffFormat Decode(IRiffChunk chunk)
 {
     using (var stream = new ReadOnlyMemoryStream(chunk.Data))
         using (var reader = new BinaryReader(stream))
         {
             return(new RiffFormat
             {
                 Format = reader.ReadInt16(),
                 Channels = reader.ReadInt16(),
                 SampleRate = reader.ReadInt32(),
                 ByteRate = reader.ReadInt32(),
                 BlockAlign = reader.ReadInt16(),
                 BitsPerSample = reader.ReadInt16(),
                 ExtraData = reader.ReadBytes(chunk.Data.Length - 16)
             });
         }
 }
コード例 #30
0
        public void UInt_WrittenAsVarint_IsSameUInt_When_ReadedBack()
        {
            Prop.ForAll <uint>(num =>
            {
                using (var wms = new WriteOnlyMemoryStream())
                {
                    Varint.WriteUInt32(num, wms);
                    var varintBytes = wms.ToArray();

                    using (var ms = new ReadOnlyMemoryStream(varintBytes))
                    {
                        var readed = Varint.ReadUInt32(ms);
                        return(readed == num);
                    }
                }
            }).QuickCheckThrowOnFailure();
        }