public List <GGCRPkdInnerFile> ListInnerFiles() { //取PKD中文件数量 int count = BitConverter.ToInt32(this.Data, 8); //文件头的总数据量(去除最后的00位) int headLength = BitConverter.ToInt32(this.Data, 16) - 1; //文件名起始索引 int cdbNamesIndexStart = 20 + count * 12; //文件名终止索引 byte[] cdbNamesData = new byte[headLength - count * 12]; Array.Copy(this.Data, 20 + count * 12, cdbNamesData, 0, cdbNamesData.Length); string[] cdbNames = Encoding.UTF8.GetString(cdbNamesData).Split('\0'); List <GGCRPkdInnerFile> files = new List <GGCRPkdInnerFile>(); //取每个文件名和地址 for (int i = 0; i < count; i++) { GGCRPkdInnerFile f = new GGCRPkdInnerFile(); f.FileName = cdbNames[i]; f.StartIndex = BitConverter.ToInt32(this.Data, 20 + 12 * i); f.StartIndexLocation = 20 + 12 * i; files.Add(f); } return(files); }
public void DeleteConvert(MachineConvertInfo convert) { GGCRPkdInnerFile file = this.GetInnerFile("MachineConversionList.cdb"); int count = BitConverter.ToInt32(this.Data, file.StartIndex + 8) - 1; //修改总数 byte[] newCount = BitConverter.GetBytes(count); this.Write(file.StartIndex + 8, newCount); //删除数据 this.DeleteInnerFile(file, convert.Index, 20); }
/// <summary> /// 在某一个内部文件的某个索引(以pkd文件头作为索引0)处删除数据,并同时调整后续所有文件的地址数据,并直接写入文件 /// </summary> /// <param name="file"></param> /// <param name="from"></param> /// <param name="length"></param> public void DeleteInnerFile(GGCRPkdInnerFile file, int from, int length) { //寻找后续文件并重排位置 foreach (GGCRPkdInnerFile next in ListInnerFiles()) { if (next.StartIndex > file.StartIndex) { byte[] arr = BitConverter.GetBytes(next.StartIndex - length); for (int i = 0; i < arr.Length; i++) { this.Data[next.StartIndexLocation + i] = arr[i]; } } } this.Delete(from, length); }
/// <summary> /// 在某一个内部文件的某个索引(以内部文件的文件头作为索引0)处插入新的数据,并同时调整后续所有文件的地址数据,并直接写入文件 /// </summary> /// <param name="file"></param> /// <param name="newIndex"></param> public void AppendInnerFile(GGCRPkdInnerFile file, int insertIndex, byte[] data) { //寻找后续文件并重排位置 foreach (GGCRPkdInnerFile next in ListInnerFiles()) { if (next.StartIndex > file.StartIndex) { byte[] arr = BitConverter.GetBytes(next.StartIndex + data.Length); for (int i = 0; i < arr.Length; i++) { this.Data[next.StartIndexLocation + i] = arr[i]; } } } this.Insert(file.StartIndex + insertIndex, data); }
public void AddConvert(GundamInfo from, GundamInfo to, int action) { byte[] data = new byte[20]; byte[] f = ByteHelper.HexStringToByteArray(from.UUID); Array.Copy(f, 0, data, 0, 8); byte[] t = ByteHelper.HexStringToByteArray(to.UUID); Array.Copy(t, 0, data, 8, 8); byte[] a = BitConverter.GetBytes(action); Array.Copy(a, 0, data, 16, 4); GGCRPkdInnerFile file = this.GetInnerFile("MachineConversionList.cdb"); int count = BitConverter.ToInt32(this.Data, file.StartIndex + 8) + 1; //修改总数 byte[] newCount = BitConverter.GetBytes(count); this.Write(file.StartIndex + 8, newCount); //插入数据 this.AppendInnerFile(file, 12, data); }