Пример #1
0
        /// <summary>
        /// Writers a <see cref="T:PListNet.PNode"/> to the specified stream.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <param name="node">The PList node.</param>
        public void Write(Stream stream, PNode node)
        {
            stream.Write(_header, 0, _header.Length);

            var offsets   = new List <int>();
            int nodeCount = GetNodeCount(node);

            byte nodeIndexSize;

            if (nodeCount <= byte.MaxValue)
            {
                nodeIndexSize = sizeof(byte);
            }
            else if (nodeCount <= short.MaxValue)
            {
                nodeIndexSize = sizeof(short);
            }
            else
            {
                nodeIndexSize = sizeof(int);
            }

            int topOffestIdx = WriteInternal(stream, nodeIndexSize, offsets, node);

            nodeCount = offsets.Count;

            int offsetTableOffset = (int)stream.Position;


            byte offsetSize;

            if (offsetTableOffset <= byte.MaxValue)
            {
                offsetSize = sizeof(byte);
            }
            else if (offsetTableOffset <= short.MaxValue)
            {
                offsetSize = sizeof(short);
            }
            else
            {
                offsetSize = sizeof(int);
            }

            for (int i = 0; i < offsets.Count; i++)
            {
                byte[] buf = null;
                switch (offsetSize)
                {
                case 1:
                    buf = new [] { (byte)offsets[i] };
                    break;

                case 2:
                    buf = BitConverter.GetBytes(EndianConverter.HostToNetworkOrder((short)offsets[i]));
                    break;

                case 4:
                    buf = BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(offsets[i]));
                    break;
                }
                stream.Write(buf, 0, buf.Length);
            }

            var header = new byte[32];

            header[6] = offsetSize;
            header[7] = nodeIndexSize;

            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(nodeCount)).CopyTo(header, 12);
            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(topOffestIdx)).CopyTo(header, 20);
            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(offsetTableOffset)).CopyTo(header, 28);

            stream.Write(header, 0, header.Length);
        }
Пример #2
0
        // Token: 0x0600002F RID: 47 RVA: 0x00002920 File Offset: 0x00000B20
        public void Write(Stream stream, PNode node)
        {
            stream.Write(BinaryFormatWriter._header, 0, BinaryFormatWriter._header.Length);
            List <int> list = new List <int>();
            int        num  = BinaryFormatWriter.GetNodeCount(node);
            byte       b;

            if (num <= 255)
            {
                b = 1;
            }
            else if (num <= 32767)
            {
                b = 2;
            }
            else
            {
                b = 4;
            }
            int host = this.WriteInternal(stream, b, list, node);

            num = list.Count;
            int  num2 = (int)stream.Position;
            byte b2;

            if (num2 <= 255)
            {
                b2 = 1;
            }
            else if (num2 <= 32767)
            {
                b2 = 2;
            }
            else
            {
                b2 = 4;
            }
            for (int i = 0; i < list.Count; i++)
            {
                byte[] array = null;
                switch (b2)
                {
                case 1:
                    array = new byte[]
                    {
                        (byte)list[i]
                    };
                    break;

                case 2:
                    array = BitConverter.GetBytes(EndianConverter.HostToNetworkOrder((short)list[i]));
                    break;

                case 4:
                    array = BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(list[i]));
                    break;
                }
                stream.Write(array, 0, array.Length);
            }
            byte[] array2 = new byte[32];
            array2[6] = b2;
            array2[7] = b;
            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(num)).CopyTo(array2, 12);
            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(host)).CopyTo(array2, 20);
            BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(num2)).CopyTo(array2, 28);
            stream.Write(array2, 0, array2.Length);
        }
Пример #3
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);
     }
 }