Moin Moin,
da ich mal wieder Langeweile im Büro grad habe, hab ich etwas rein aus Neugier mal versucht die M2-Pack Logik in C# nachzubauen, kam dann aber doch auf den Trichter das ganze mal umzubauen.
Aktuell habe ich mir folgendes Format überlegt: <FileCount>|(<FileNameLength>|<FileName>|<FileSize>|<FileBytes>)|...
Ich möchte hierbei auch gerne die EterIndex-Files (EIX) loswerden und die Informationen in einer Datei speichern.
Das ganze habe ich aktuell zum Test so umgesetzt:
- string packFolder = Path.Combine(Application.StartupPath, "pack");
- string unpackFolder = Path.Combine(Application.StartupPath, "unpack");
- string packFile = packFolder + ".pack";
- List<byte> bytes = new List<byte>();
- string[] files = Directory.GetFiles(packFolder);
- //FileCount
- bytes.AddRange(BitConverter.GetBytes(files.Length));
- foreach (string file in files)
- {
- FileInfo fileInfo = new FileInfo(file);
- string virtualPath = fileInfo.FullName.Replace(fileInfo.DirectoryName, string.Empty);
- virtualPath = virtualPath.Substring(1, virtualPath.Length - 1);
- byte[] tmp = File.ReadAllBytes(file);
- //FileNameLength
- bytes.AddRange(BitConverter.GetBytes(virtualPath.Length));
- //FileName
- bytes.AddRange(Encoding.Default.GetBytes(virtualPath));
- //FileSize
- bytes.AddRange(BitConverter.GetBytes(tmp.Length));
- //FileContent
- bytes.AddRange(tmp);
- }
- byte[] writeBytes = bytes.ToArray();
- #region Compress, Encrypt, Write Pack-File
- byte[] compressedBytes = LZ4Codec.Wrap(writeBytes);
- byte[] encryptedBytes = AesHelper.Encrypt(compressedBytes);
- File.WriteAllBytes(packFile, encryptedBytes);
- #endregion
- #region Decrypt, Decompress, Write Unpacked-Files
- byte[] inBytes = File.ReadAllBytes(packFile);
- byte[] decryptedBytes = AesHelper.Decrypt(inBytes);
- byte[] decompressedBytes = LZ4Codec.Unwrap(decryptedBytes);
- int fileCount = BitConverter.ToInt16(decompressedBytes, 0);
- int offset = sizeof(int);
- for (int i = 0; i < fileCount; i++)
- {
- int fileNameLength = BitConverter.ToInt16(decompressedBytes, offset);
- offset += sizeof(int);
- byte[] fileNameBytes = decompressedBytes.Slice(offset, offset + fileNameLength);
- string fileName = Encoding.Default.GetString(fileNameBytes);
- offset += fileNameLength;
- int fileSize = BitConverter.ToInt16(decompressedBytes, offset);
- offset += sizeof(int);
- byte[] fileContent = decompressedBytes.Slice(offset, offset + fileSize);
- offset += fileSize;
- File.WriteAllBytes(Path.Combine(unpackFolder, fileName), fileContent);
- }
- #endregion
Cryption: AES (System.Cryptography)
Compression: LZ4 (LZ4Net Nugget-Package)
Hauptanliegen dieses Threads soll sein, über mögliche Cryption-/Compressions-Methoden oder dem Pack-Format selber zu diskutieren.
Lasst mal hören was ihr davon so haltet.
Natürlich werde ich im Anschluss den Eterpack des Client darauf anpassen und mal sehen was ich dann damit anstelle