/// <summary>
        /// Formats a node index based on the size.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="nodeIndexSize">The node index size.</param>
        /// <returns>The formated idx.</returns>
        private static byte[] FormatIdx(int index, byte nodeIndexSize)
        {
            switch (nodeIndexSize)
            {
            case 1:
                return(new [] { (byte)index });

            case 2:
                return(BitConverter.GetBytes(EndianConverter.HostToNetworkOrder((short)index)));

            case 4:
                return(BitConverter.GetBytes(EndianConverter.HostToNetworkOrder(index)));

            default:
                throw new PListFormatException("Invalid node index size");
            }
        }
        // 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);
        }
        /// <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);
        }