public LuaObject Receive(IMessageQueue queue, int position) { var messageId = queue.ReadInt32(position); var message = this.registry.GetDefinition(messageId); Dictionary<LuaObject, LuaObject> table = new Dictionary<LuaObject, LuaObject>(); foreach (var property in message.Properties) { var key = LuaObject.FromString(property.Name); switch (property.PropertyType) { case PropertyTypes.Int32: table[key] = LuaObject.FromNumber(queue.ReadInt32(position + property.Offset)); break; case PropertyTypes.Single: table[key] = LuaObject.FromNumber(queue.ReadFloat(position + property.Offset)); break; case PropertyTypes.String: table[key] = LuaObject.FromString( ExtensionMethods.ReadStringContent(queue, position + queue.ReadInt32(position + property.Offset))); break; default: throw new NotImplementedException(); } } return LuaObject.FromTable(table); }
public static string ReadStringContent(IMessageQueue queue, int contentIndex) { //TODO: avoid list allocation. var res = new List<byte>(32); for (;;) { int val = queue.ReadInt32(contentIndex); ++contentIndex; byte b; b = (byte)(val & 255); if (b == 0) { break; } res.Add(b); b = (byte)((val >> 8) & 255); if (b == 0) { break; } res.Add(b); b = (byte)((val >> 16) & 255); if (b == 0) { break; } res.Add(b); b = (byte)((val >> 24) & 255); if (b == 0) { break; } res.Add(b); } var array = res.ToArray(); return Encoding.UTF8.GetString(array, 0, array.Length); }