コード例 #1
0
        private static int[] ReadNodeOffsets(Stream stream, byte[] header)
        {
            var offsetSize = header[6];

            var nodeCount         = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(header, 12));
            var offsetTableOffset = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(header, 28));
            var offsetTableBuffer = new byte[nodeCount * offsetSize];

            stream.Seek(offsetTableOffset, SeekOrigin.Begin);
            if (stream.Read(offsetTableBuffer, 0, offsetTableBuffer.Length) != offsetTableBuffer.Length)
            {
                throw new PListFormatException("Invalid offsetTable Size");
            }

            var nodeOffsets = new int[nodeCount];

            for (var i = 0; i < nodeCount; i++)
            {
                var cur = new byte[sizeof(uint)];
                for (var j = 0; j < offsetSize; j++)
                {
                    cur[offsetSize - 1 - j] = offsetTableBuffer[i * offsetSize + j];
                }
                nodeOffsets[i] = BitConverter.ToInt32(cur, 0);
            }

            return(nodeOffsets);
        }
コード例 #2
0
 // Token: 0x0600002C RID: 44 RVA: 0x00002830 File Offset: 0x00000A30
 private void ReadInDictionary(IDictionary <string, PNode> node, int nodeLength, BinaryFormatReader.ReaderState readerState)
 {
     byte[] array  = new byte[nodeLength * readerState.IndexSize];
     byte[] array2 = new byte[nodeLength * readerState.IndexSize];
     if (readerState.Stream.Read(array, 0, array.Length) != array.Length)
     {
         throw new PListFormatException();
     }
     if (readerState.Stream.Read(array2, 0, array2.Length) != array2.Length)
     {
         throw new PListFormatException();
     }
     for (int i = 0; i < nodeLength; i++)
     {
         short      elemIdx    = (readerState.IndexSize == 1) ? ((short)array[i]) : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(array, 2 * i));
         StringNode stringNode = this.ReadInternal(readerState, (int)elemIdx) as StringNode;
         if (stringNode == null)
         {
             throw new PListFormatException("Key is not a string");
         }
         elemIdx = ((readerState.IndexSize == 1) ? ((short)array2[i]) : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(array2, 2 * i)));
         PNode value = this.ReadInternal(readerState, (int)elemIdx);
         node.Add(stringNode.Value, value);
     }
 }
コード例 #3
0
        // Token: 0x06000026 RID: 38 RVA: 0x0000259C File Offset: 0x0000079C
        public PNode Read(Stream stream)
        {
            byte[] array       = BinaryFormatReader.ReadHeader(stream);
            int[]  nodeOffsets = BinaryFormatReader.ReadNodeOffsets(stream, array);
            byte   indexSize   = array[7];

            BinaryFormatReader.ReaderState readerState = new BinaryFormatReader.ReaderState(stream, nodeOffsets, (int)indexSize);
            int elemIdx = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(array, 20));

            return(this.ReadInternal(readerState, elemIdx));
        }
コード例 #4
0
 // Token: 0x0600002B RID: 43 RVA: 0x000027C0 File Offset: 0x000009C0
 private void ReadInArray(ICollection <PNode> node, int nodeLength, BinaryFormatReader.ReaderState readerState)
 {
     byte[] array = new byte[nodeLength * readerState.IndexSize];
     if (readerState.Stream.Read(array, 0, array.Length) != array.Length)
     {
         throw new PListFormatException();
     }
     for (int i = 0; i < nodeLength; i++)
     {
         short elemIdx = (readerState.IndexSize == 1) ? ((short)array[i]) : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(array, 2 * i));
         node.Add(this.ReadInternal(readerState, (int)elemIdx));
     }
 }
コード例 #5
0
        /// <summary>
        /// Reads a binary formated <see cref="T:PListNet.PNode"/> from the specified stream.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <returns>The <see cref="T:PListNet.PNode"/>, read from the specified stream</returns>
        public PNode Read(Stream stream)
        {
            // read in file header
            var header = ReadHeader(stream);

            // read in node offsets
            var nodeOffsets = ReadNodeOffsets(stream, header);

            var indexSize = header[7];

            var readerState = new ReaderState(stream, nodeOffsets, indexSize);

            var topNode = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(header, 20));

            return(ReadInternal(readerState, topNode));
        }
コード例 #6
0
        private void ReadInArray(ICollection <PNode> node, int nodeLength, ReaderState readerState)
        {
            var buf = new byte[nodeLength * readerState.IndexSize];

            if (readerState.Stream.Read(buf, 0, buf.Length) != buf.Length)
            {
                throw new PListFormatException();
            }

            for (int i = 0; i < nodeLength; i++)
            {
                var topNode = readerState.IndexSize == 1
                                        ? buf[i]
                                        : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(buf, 2 * i));
                node.Add(ReadInternal(readerState, topNode));
            }
        }
コード例 #7
0
        private void ReadInDictionary(IDictionary <string, PNode> node, int nodeLength, ReaderState readerState)
        {
            var bufKeys = new byte[nodeLength * readerState.IndexSize];
            var bufVals = new byte[nodeLength * readerState.IndexSize];

            if (readerState.Stream.Read(bufKeys, 0, bufKeys.Length) != bufKeys.Length)
            {
                throw new PListFormatException();
            }

            if (readerState.Stream.Read(bufVals, 0, bufVals.Length) != bufVals.Length)
            {
                throw new PListFormatException();
            }

            for (int i = 0; i < nodeLength; i++)
            {
                var topNode = readerState.IndexSize == 1
                                        ? bufKeys[i]
                                        : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(bufKeys, 2 * i));
                var plKey = ReadInternal(readerState, topNode);

                var stringKey = plKey as StringNode;
                if (stringKey == null)
                {
                    throw new PListFormatException("Key is not a string");
                }

                topNode = readerState.IndexSize == 1
                                        ? bufVals[i]
                                        : EndianConverter.NetworkToHostOrder(BitConverter.ToInt16(bufVals, 2 * i));
                var plVal = ReadInternal(readerState, topNode);

                node.Add(stringKey.Value, plVal);
            }
        }
コード例 #8
0
        // Token: 0x06000028 RID: 40 RVA: 0x0000261C File Offset: 0x0000081C
        private static int[] ReadNodeOffsets(Stream stream, byte[] header)
        {
            byte b    = header[6];
            int  num  = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(header, 12));
            int  num2 = EndianConverter.NetworkToHostOrder(BitConverter.ToInt32(header, 28));

            byte[] array = new byte[num * (int)b];
            stream.Seek((long)num2, SeekOrigin.Begin);
            if (stream.Read(array, 0, array.Length) != array.Length)
            {
                throw new PListFormatException("Invalid offsetTable Size");
            }
            int[] array2 = new int[num];
            for (int i = 0; i < num; i++)
            {
                byte[] array3 = new byte[4];
                for (int j = 0; j < (int)b; j++)
                {
                    array3[(int)(b - 1) - j] = array[i * (int)b + j];
                }
                array2[i] = BitConverter.ToInt32(array3, 0);
            }
            return(array2);
        }