Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 /// <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);
 }
Exemple #4
0
 /// <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);
 }
Exemple #5
0
        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);
        }