ByteArray Compress(const ByteArrayView view, const int32 compressionLevel) { const size_t bufferSize = ZSTD_compressBound(view.size()); Array<Byte> buffer(bufferSize); const size_t result = ZSTD_compress(buffer.data(), buffer.size(), view.data(), view.size(), compressionLevel); if (ZSTD_isError(result)) { return ByteArray(); } buffer.resize(result); buffer.shrink_to_fit(); return ByteArray(std::move(buffer)); }
ByteArray Decompress(const ByteArrayView view) { const uint64 originalSize = ZSTD_getDecompressedSize(view.data(), view.size()); if (originalSize == 0) { return ByteArray(); } Array<Byte> outputBuffer(static_cast<size_t>(originalSize)); const size_t decompressedSize = ZSTD_decompress(outputBuffer.data(), outputBuffer.size(), view.data(), view.size()); if (originalSize != decompressedSize) { return ByteArray(); } return ByteArray(std::move(outputBuffer)); }
bool DecompressToFile(const ByteArrayView view, const FilePath& outputPath) { const size_t inputBufferSize = ZSTD_DStreamInSize(); const auto pInputBuffer = std::make_unique<Byte[]>(inputBufferSize); const size_t outputBufferSize = ZSTD_DStreamOutSize(); const auto pOutputBuffer = std::make_unique<Byte[]>(outputBufferSize); ZSTD_DStream* const dStream = ZSTD_createDStream(); if (!dStream) { return false; } const size_t initResult = ZSTD_initDStream(dStream); if (ZSTD_isError(initResult)) { ZSTD_freeDStream(dStream); return false; } size_t toRead = initResult; BinaryWriter writer(outputPath); if (!writer) { ZSTD_freeDStream(dStream); return false; } ReaderView reader(view.data(), view.size()); for (;;) { const size_t read = std::min<size_t>(toRead, view.size() - static_cast<size_t>(reader.getPos())); if (read == 0) { break; } reader.read(pInputBuffer.get(), read); ZSTD_inBuffer input = { pInputBuffer.get(), read, 0 }; while (input.pos < input.size) { ZSTD_outBuffer output = { pOutputBuffer.get(), outputBufferSize, 0 }; toRead = ZSTD_decompressStream(dStream, &output, &input); if (ZSTD_isError(toRead)) { writer.clear(); ZSTD_freeDStream(dStream); return false; } writer.write(pOutputBuffer.get(), output.pos); } } ZSTD_freeDStream(dStream); return true; }
/// <summary> /// データを Base64 エンコードします。 /// </summary> /// <param name="view"> /// エンコードするデータ /// </param> /// <returns> /// エンコードされたテキストデータ、エンコードに失敗した場合空の文字列 /// </returns> inline String Encode(const ByteArrayView view) { return Encode(view.data(), view.size()); }
/// <summary> /// ファイルにデータを書き込みます。 /// </summary> /// <param name="view"> /// 書き込むデータ /// </param> /// <returns> /// 実際に書き込んだサイズ(バイト) /// </returns> int64 write(ByteArrayView view) { return write(view.data(), view.size()); }