public unsafe static TmphSubArray<int> splitIntNoCheck(this string ints, char split) { TmphSubArray<int> values = new TmphSubArray<int>(); if (ints != null && ints.Length != 0) { fixed (char* intPoint = ints) { int intValue = 0; for (char* next = intPoint, end = intPoint + ints.Length; next != end; ++next) { if (*next == split) { values.Add(intValue); intValue = 0; } else { intValue *= 10; intValue += *next; intValue -= '0'; } } values.Add(intValue); } } return values; }
/// <summary> /// 获取字段成员集合 /// </summary> /// <param name="type"></param> /// <param name="attribute"></param> /// <param name="memberCountVerify"></param> /// <param name="fixedSize"></param> /// <param name="nullMapSize"></param> /// <returns>字段成员集合</returns> public static TmphSubArray<TmphMemberInfo> GetFields(Type type, TmphDataSerialize attribute, out int memberCountVerify, out int fixedSize, out int nullMapSize) { var fieldIndexs = (TmphFieldIndex[]) typeof(TmphMemberIndexGroup<>).MakeGenericType(type) .GetMethod("GetFields", BindingFlags.Static | BindingFlags.Public) .Invoke(null, new object[] { attribute.MemberFilter }); var fields = new TmphSubArray<TmphMemberInfo>(fieldIndexs.Length); var nullMapIndex = 0; fixedSize = nullMapSize = 0; foreach (var field in fieldIndexs) { type = field.Member.FieldType; if (!type.IsPointer && (!type.IsArray || type.GetArrayRank() == 1) && !field.IsIgnore) { var memberAttribute = field.GetAttribute<TmphBinarySerialize.TmphMember>(true, true); if (memberAttribute == null || memberAttribute.IsSetup) { var value = TmphMemberInfo.GetSerialize(field); if (type != typeof(bool)) fixedSize += value.SerializeFixedSize; nullMapSize += value.NullMapSize; if (value.NullMapSize == 2) { value.SerializeNullMapIndex = nullMapIndex; nullMapIndex += 2; --fixedSize; } fields.Add(value); } } } memberCountVerify = fields.Count + 0x40000000; fixedSize = (fixedSize + 3) & (int.MaxValue - 3); nullMapSize = ((nullMapSize + 31) >> 5) << 2; fields.Sort(TmphMemberInfo.SerializeFixedSizeSort); foreach (var value in fields) { if (value.NullMapSize == 1) value.SerializeNullMapIndex = nullMapIndex++; } return fields; }