예제 #1
0
        public InternalDataBlock Decode(BinaryData encodedData)
        {
            var parser = BinaryDataParser.OfValue(encodedData);

            var blockType       = parser.TakeAndSkip(1).ToInt32();
            var blockLevel      = parser.TakeAndSkip(1).ToInt32();
            var numberOfEntries = parser.TakeAndSkip(2).ToInt32();
            var totalByteCount  = parser.TakeAndSkip(4).ToInt32();
            var entries         = parser.TakeAndSkip(numberOfEntries * 8);
            var padding         = BinaryData.Empty();

            var remainingTo64Boundary = Utilities.GetRemainingToNextMultipleOf(numberOfEntries * 8 + 8, 64);

            if (remainingTo64Boundary > 0)
            {
                padding = parser.TakeAndSkip(remainingTo64Boundary);
            }

            var trailer = parser.TakeAndSkip(16, trailerDecoder);

            return(new InternalDataBlock(
                       blockType,
                       blockLevel,
                       numberOfEntries,
                       totalByteCount,
                       entries,
                       padding,
                       trailer));
        }
예제 #2
0
        public SubnodeBlock Decode(BinaryData encodedData)
        {
            var parser = BinaryDataParser.OfValue(encodedData);

            var blockType  = parser.TakeAndSkip(1).ToInt32();
            var blockLevel = parser.TakeAndSkip(1).ToInt32();

            var entrySize =
                blockLevel == 1
                ? 16
                : 24;

            var numberOfEntries = parser.TakeAndSkip(2).ToInt32();
            var padding         = parser.TakeAndSkip(4);
            var entries         = parser.TakeAndSkip(numberOfEntries * entrySize);
            var entriesPadding  = BinaryData.Empty();

            var remainingTo64Boundary = Utilities.GetRemainingToNextMultipleOf(numberOfEntries * entrySize + 8, 64);

            if (remainingTo64Boundary > 0)
            {
                entriesPadding = parser.TakeAndSkip(remainingTo64Boundary);
            }

            var trailer = parser.TakeAndSkip(16, trailerDecoder);

            return
                (new SubnodeBlock(
                     blockType,
                     blockLevel,
                     numberOfEntries,
                     padding,
                     entries,
                     entriesPadding,
                     trailer));
        }