public string ReadValue(int itemId, string memberName) { BdatMember member = MembersDict[memberName]; int itemIndex = itemId - BaseId; int itemOffset = ItemTableOffset + itemIndex * ItemSize; int valueOffset = itemOffset + member.MemberPos; if (member.Type == BdatMemberType.Array) //return "Array"; { String outString = ""; //Set data length by type int bytes = GetTypeBytes(member.ValType); //Add each item for (int i = 0; i < member.ArrayCount; i++) { outString = string.Concat(outString, ReadIndividualValue(member, valueOffset + i * bytes).ToString()); if (i < member.ArrayCount - 1) { outString = string.Concat(outString, ":"); } } return(outString); } if (member.Type == BdatMemberType.Flag) { BdatMember flagsMember = Members[member.FlagVarIndex]; return(ReadFlag(Data, itemOffset, member, flagsMember)); } return(ReadIndividualValue(member, valueOffset)); }
private static string ReadFlag(DataBuffer table, int itemOffset, BdatMember member, BdatMember flagsMember) { uint flags = table[itemOffset + flagsMember.MemberPos]; return(((flags & member.FlagMask) != 0).ToString()); //return (Convert.ToString(flags, 2).PadLeft(8, '0') + " & "+ Convert.ToString(member.FlagMask, 2).PadLeft(8,'0') + " -> " + ((flags & member.FlagMask) != 0).ToString()); }
public void WriteValue(int itemId, string memberName, string value) { BdatMember member = MembersDict[memberName]; int itemIndex = itemId - BaseId; int itemOffset = ItemTableOffset + itemIndex * ItemSize; int valueOffset = itemOffset + member.MemberPos; if (member.Type != BdatMemberType.Scalar) { return; } switch (member.ValType) { case BdatValueType.UInt8: Data.WriteUInt8(byte.Parse(value), valueOffset); break; case BdatValueType.UInt16: Data.WriteUInt16(ushort.Parse(value), valueOffset); break; case BdatValueType.UInt32: Data.WriteUInt32(uint.Parse(value), valueOffset); break; case BdatValueType.Int8: Data.WriteInt8(sbyte.Parse(value), valueOffset); break; case BdatValueType.Int16: Data.WriteInt16(short.Parse(value), valueOffset); break; case BdatValueType.Int32: Data.WriteInt32(int.Parse(value), valueOffset); break; case BdatValueType.FP32: Data.WriteSingle(float.Parse(value), valueOffset); break; case BdatValueType.String: int offset = Data.ReadInt32(valueOffset); string oldValue = Data.ReadUTF8Z(offset); int oldLength = Encoding.UTF8.GetByteCount(oldValue); int length = Encoding.UTF8.GetByteCount(value); if (length > oldLength) { throw new ArgumentOutOfRangeException(nameof(value), "String is too long"); } Data.WriteUTF8Z(value, offset); break; default: throw new IndexOutOfRangeException(); } }
public string ReadString(int itemId, string memberName) { BdatMember member = MembersDict[memberName]; int itemIndex = itemId - BaseId; int itemOffset = ItemTableOffset + itemIndex * ItemSize; int valueOffset = itemOffset + member.MemberPos; if (member.Type != BdatMemberType.Scalar) { throw new NotImplementedException(); } return(ReadStringValue(valueOffset, member.ValType)); }
public string ReadValue(int itemId, string memberName) { BdatMember member = MembersDict[memberName]; int itemIndex = itemId - BaseId; int itemOffset = ItemTableOffset + itemIndex * ItemSize; int valueOffset = itemOffset + member.MemberPos; if (member.Type == BdatMemberType.Array) { return("Array"); } if (member.Type == BdatMemberType.Flag) { return("Flag"); } switch (member.ValType) { case BdatValueType.UInt8: return(Data[valueOffset].ToString()); case BdatValueType.UInt16: return(Data.ReadUInt16(valueOffset).ToString()); case BdatValueType.UInt32: return(Data.ReadUInt32(valueOffset).ToString()); case BdatValueType.Int8: return(((sbyte)Data[valueOffset]).ToString()); case BdatValueType.Int16: return(Data.ReadInt16(valueOffset).ToString()); case BdatValueType.Int32: return(Data.ReadInt32(valueOffset).ToString()); case BdatValueType.String: return(Data.ReadUTF8Z(Data.ReadInt32(valueOffset))); case BdatValueType.FP32: if (Data.Game == Game.XBX) { uint value = Data.ReadUInt32(valueOffset); return(((float)(value * (1 / 4096.0))).ToString("R")); } return(Data.ReadSingle(valueOffset).ToString("R")); default: throw new IndexOutOfRangeException(); } }
private void WriteIndividualValue(BdatMember member, int valueOffset, string value) { switch (member.ValType) { case BdatValueType.UInt8: Data.WriteUInt8(byte.Parse(value), valueOffset); break; case BdatValueType.UInt16: Data.WriteUInt16(ushort.Parse(value), valueOffset); break; case BdatValueType.UInt32: Data.WriteUInt32(uint.Parse(value), valueOffset); break; case BdatValueType.Int8: Data.WriteInt8(sbyte.Parse(value), valueOffset); break; case BdatValueType.Int16: Data.WriteInt16(short.Parse(value), valueOffset); break; case BdatValueType.Int32: Data.WriteInt32(int.Parse(value), valueOffset); break; case BdatValueType.FP32: Data.WriteSingle(float.Parse(value), valueOffset); break; case BdatValueType.String: int offset = Data.ReadInt32(valueOffset); string oldValue = Data.ReadUTF8Z(offset); int oldLength = Encoding.UTF8.GetByteCount(oldValue); int length = Encoding.UTF8.GetByteCount(value); if (length > oldLength) { throw new ArgumentOutOfRangeException(nameof(value), "String is too long! Must be shorter or equal to previous."); } Data.WriteUTF8Z(value, offset); break; default: throw new IndexOutOfRangeException(); } }
public static BdatMember[] ReadTableMembers(DataBuffer file) { int memberTableOffset = file.ReadUInt16(32); int memberCount = file.ReadUInt16(34); var members = new BdatMember[memberCount]; var usedNames = new HashSet <string>(); for (int i = 0; i < memberCount; i++) { int memberOffset = memberTableOffset + i * 6; var member = new BdatMember(file, memberOffset, usedNames); members[i] = member; } return(members); }
public void PrependMember(BdatMember newMember) { foreach (BdatMember member in Members.Where(x => x.Type == BdatMemberType.Flag)) { member.FlagVarIndex++; } MembersDict.Add(newMember.Name, newMember); var newMemberArray = new BdatMember[Members.Length + 1]; newMemberArray[0] = newMember; Array.Copy(Members, 0, newMemberArray, 1, Members.Length); Members = newMemberArray; }
public void WriteValue(int itemId, string memberName, string value) { BdatMember member = MembersDict[memberName]; int itemIndex = itemId - BaseId; int itemOffset = ItemTableOffset + itemIndex * ItemSize; int valueOffset = itemOffset + member.MemberPos; if (member.Type == BdatMemberType.Array) { int i = 0; int bytes = GetTypeBytes(member.ValType); string[] array_items = value.Split(':'); foreach (String array_item in array_items) { WriteIndividualValue(member, valueOffset + i * bytes, array_item); i++; } } if (member.Type == BdatMemberType.Flag) { if (value == "True" || value == "False") { BdatMember flagsMember = Members[member.FlagVarIndex]; uint flags = Data[itemOffset + flagsMember.MemberPos]; uint newVal = 0; if (value == "True") { newVal = flags | member.FlagMask; } else { newVal = flags ^ (flags & member.FlagMask); } Data.WriteUInt8(Convert.ToByte(newVal), itemOffset + flagsMember.MemberPos); return; } else { throw new ArgumentOutOfRangeException(nameof(value), "Flags must be True or False exactly!"); } } WriteIndividualValue(member, valueOffset, value); }
public static BdatMember[] ReadTableMembersFromHash(DataBuffer file) { int hashTableOffset = file.ReadUInt16(10); int hashTableLength = file.ReadUInt16(12); var members = new List <BdatMember>(); var usedNames = new HashSet <string>(); for (int i = 0; i < hashTableLength; i++) { int nextChain = file.ReadUInt16(hashTableOffset + i * 2); while (nextChain != 0) { var member = new BdatMember(file, nextChain, usedNames); members.Add(member); nextChain = file.ReadUInt16(nextChain + 2); } } return(members.OrderBy(x => x.MemberPos).ToArray()); }
private string ReadIndividualValue(BdatMember member, int valueOffset) //Custom, only used for arrays. { switch (member.ValType) { case BdatValueType.UInt8: return(Data[valueOffset].ToString()); case BdatValueType.UInt16: return(Data.ReadUInt16(valueOffset).ToString()); case BdatValueType.UInt32: return(Data.ReadUInt32(valueOffset).ToString()); case BdatValueType.Int8: return(((sbyte)Data[valueOffset]).ToString()); case BdatValueType.Int16: return(Data.ReadInt16(valueOffset).ToString()); case BdatValueType.Int32: return(Data.ReadInt32(valueOffset).ToString()); case BdatValueType.String: return(Data.ReadUTF8Z(Data.ReadInt32(valueOffset))); case BdatValueType.FP32: if (Data.Game == Game.XBX) { uint value = Data.ReadUInt32(valueOffset); return(((float)(value * (1 / 4096.0))).ToString("R")); } return(Data.ReadSingle(valueOffset).ToString("R")); default: throw new IndexOutOfRangeException(); } }