public ZtrFileTextPacker(Stream output, ZtrFileEntry[] input, ZtrFileHeader header, FFXIIITextEncoding encoding) { _output = output; _input = input; _header = header; _encoding = encoding; }
public unsafe void Pack(ZtrFileHeader header) { int uncompressedSize = 0; int index = 0; byte[] writeBuff = new byte[4096]; byte[] codeBuff = new byte[256]; fixed (byte* writeBuffPtr = &writeBuff[0]) fixed (byte* codeBuffPtr = &codeBuff[0]) { for (int e = 0; e < _input.Length; e++) { ZtrFileEntry entry = _input[e]; int count = Encoding.ASCII.GetBytes(entry.Key, 0, entry.Key.Length, codeBuff, 0); for (int b = 0; b < count; b++) { writeBuffPtr[index++] = codeBuffPtr[b]; if (index == writeBuff.Length) WriteBlock(writeBuff, ref index, ref uncompressedSize); } } } if (index > 0) WriteBlock(writeBuff, ref index, ref uncompressedSize); header.KeysUnpackedSize = uncompressedSize; }
private ZtrFileEntry[] ExtractBigEndianCompressedDictionary() { ZtrFileHeader header = new ZtrFileHeader(); header.ReadFromStream(_input); ZtrFileEntry[] result = new ZtrFileEntry[header.Count]; result.InitializeElements(); ZtrFileKeysUnpacker keysUnpacker = new ZtrFileKeysUnpacker(_input, result); keysUnpacker.Unpack(header.KeysUnpackedSize); ZtrFileTextUnpacker textUnpacker = new ZtrFileTextUnpacker(_input, result, header.TextLinesTable, _encoding); textUnpacker.Unpack(header.TextBlockTable[header.TextBlockTable.Length - 1]); return result; }
private ZtrFileEntry[] ExtractBigEndianCompressedDictionary() { ZtrFileHeader header = new ZtrFileHeader(); header.ReadFromStream(_input); ZtrFileEntry[] result = new ZtrFileEntry[header.Count]; result.InitializeElements(); ZtrFileKeysUnpacker keysUnpacker = new ZtrFileKeysUnpacker(_input, result); keysUnpacker.Unpack(header.KeysUnpackedSize); ZtrFileTextUnpacker textUnpacker = new ZtrFileTextUnpacker(_input, result, header.TextLinesTable, _encoding); textUnpacker.Unpack(header.TextBlockTable[header.TextBlockTable.Length - 1]); return(result); }
private void PackBigEndianCompressedDictionary(ZtrFileEntry[] entries) { _bw.Write((int)ZtrFileType.BigEndianCompressedDictionary); ZtrFileHeader header = new ZtrFileHeader { Version = 1, Count = entries.Length }; using (MemoryStream ms = new MemoryStream(32 * 1024)) { ZtrFileKeysPacker keyPacker = new ZtrFileKeysPacker(ms, entries); keyPacker.Pack(header); ZtrFileTextPacker textPacker = new ZtrFileTextPacker(ms, entries, _encoding); textPacker.Pack(header); header.WriteToStream(_output); ms.Position = 0; ms.CopyTo(_output); } }
private void PackBigEndianCompressedDictionary(ZtrFileEntry[] entries) { if (entries.Length > 0) throw new NotImplementedException(); _bw.Write((int)ZtrFileType.BigEndianCompressedDictionary); ZtrFileHeader header = new ZtrFileHeader(); header.Version = 1; header.Count = entries.Length; using (MemoryStream ms = new MemoryStream(32 * 1024)) { ZtrFileKeysPacker keyPacker = new ZtrFileKeysPacker(ms, entries); keyPacker.Pack(header); ZtrFileTextPacker textPacker = new ZtrFileTextPacker(ms, entries, header, _encoding); textPacker.Pack(); } long headerPosition = _output.Position; //_output.Seek(entries.Length * 8) }
public unsafe void Pack(ZtrFileHeader header) { int uncompressedSize = 0; ushort index = 0; byte[] writeBuff = new byte[4096]; byte[] codeBuff = new byte[256]; fixed(byte *writeBuffPtr = &writeBuff[0]) fixed(byte *codeBuffPtr = &codeBuff[0]) { for (int e = 0; e < _input.Length; e++) { ZtrFileEntry entry = _input[e]; int count = Encoding.ASCII.GetBytes(entry.Key, 0, entry.Key.Length, codeBuff, 0); codeBuff[count++] = 0; for (int b = 0; b < count; b++) { writeBuffPtr[index++] = codeBuffPtr[b]; if (index == writeBuff.Length) { WriteBlock(writeBuff, ref index, ref uncompressedSize); } } } } if (index > 0) { WriteBlock(writeBuff, ref index, ref uncompressedSize); } header.KeysUnpackedSize = uncompressedSize; }
public unsafe void Pack(ZtrFileHeader header) { _blockOffset = 0; _blockNumber = 0; _innerIndex = 0; _innerCount = 0; List <int> blockOffsets = new List <int>(256) { 0 }; ZtrFileHeaderLineInfo[] lines = new ZtrFileHeaderLineInfo[_input.Length]; ushort[,] innerOffsets = new ushort[_input.Length, 2]; ushort writeIndex = 0; byte[] writeBuff = new byte[4096]; byte[] codeBuff = new byte[64 * 1024]; fixed(byte *writeBuffPtr = &writeBuff[0]) fixed(byte *codeBuffPtr = &codeBuff[0]) { for (int e = 0; e < _input.Length; e++) { _innerCount++; innerOffsets[e, 0] = writeIndex; ZtrFileEntry entry = _input[e]; int count = _encoding.GetBytes(entry.Value, 0, entry.Value.Length, codeBuff, 0); codeBuff[count++] = 0; codeBuff[count++] = 0; lines[e] = new ZtrFileHeaderLineInfo { Block = _blockNumber, BlockOffset = 0 // See below: lines[i].BlockOffset = checked ((byte)innerOffsets[i, 1]); }; for (int b = 0; b < count; b++) { writeBuffPtr[writeIndex++] = codeBuffPtr[b]; if (writeIndex == writeBuff.Length) { WriteBlock(writeBuff, ref writeIndex, innerOffsets, blockOffsets); } } } } if (writeIndex > 0) { WriteBlock(writeBuff, ref writeIndex, innerOffsets, blockOffsets); } for (int i = 0; i < innerOffsets.Length / 2; i++) { lines[i].PackedOffset = innerOffsets[i, 0]; lines[i].BlockOffset = checked ((byte)innerOffsets[i, 1]); } if (blockOffsets.Count > _blockNumber) { _blockNumber++; } header.TextBlocksCount = _blockNumber; header.TextBlockTable = blockOffsets.ToArray(); header.TextLinesTable = lines; }