/// <summary> /// Reads all the messages from the message byte code. /// </summary> /// <param name="messageData">Message byte code.</param> /// <param name="encodedMessages">True if messages are encoded.</param> /// <returns>Collection of messages.</returns> private static List <string> DecompileMessages(byte[] messageData, bool encodedMessages) { var messages = new List <string>(); int messagesOffset = 0; //////////////// // Messages header // [0] = Number of messages int numMessages = messageData[messagesOffset]; messagesOffset += 1; // [1][2] = Offset of end of messages messagesOffset += 2; // [3+] = Offset of each message (as per number of messages) // [x+] = Message data int messageDataOffset = messagesOffset + (numMessages * 2); if (numMessages > 0) { if (encodedMessages) { // decrypt the data in-place, this modifies the buffer passed as input var xform = new XorTransform(Key); xform.TransformBlock(messageData, messageDataOffset, messageData.Length - messageDataOffset, messageData, messageDataOffset); } // Go back to array of offset of each message for (int i = 0; i < numMessages; i++) { // [0][1] = Offset of message int messageOffset = (messageData[messagesOffset + 1] * 0x100) + messageData[messagesOffset]; messagesOffset += 2; string msg; if ((messageOffset - 2) >= 0) { msg = StringDecoder.GetNullTerminatedString(messageData, messageOffset + 1); } else { msg = string.Empty; } messages.Add(msg); } } return(messages); }
/// <summary> /// Decode the inventory resource from byte array. /// </summary> /// <param name="data">Source array (data may be encrypted).</param> /// <param name="padded">Inventory data is padded.</param> /// <returns>Inventory resource.</returns> public static InventoryResource DecryptAndReadInventory(byte[] data, bool padded) { if (IsInventoryEncrypted(data, padded)) { // Decrypt the data var xform = new XorTransform(XorKey); data = xform.TransformFinalBlock(data, 0, data.Length); } // Read the objects from the buffer return(ReadInventory(data, padded)); }