/// <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); }
// 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); }
// 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); } }