コード例 #1
0
ファイル: SivCompression.cpp プロジェクト: Siv3D/OpenSiv3D
		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));
		}
コード例 #2
0
ファイル: SivCompression.cpp プロジェクト: Siv3D/OpenSiv3D
		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));
		}
コード例 #3
0
ファイル: SivCompression.cpp プロジェクト: Siv3D/OpenSiv3D
		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;
		}
コード例 #4
0
ファイル: Base64.hpp プロジェクト: Fuyutsubaki/OpenSiv3D
		/// <summary>
		/// データを Base64 エンコードします。
		/// </summary>
		/// <param name="view">
		/// エンコードするデータ
		/// </param>
		/// <returns>
		/// エンコードされたテキストデータ、エンコードに失敗した場合空の文字列
		/// </returns>
		inline String Encode(const ByteArrayView view)
		{
			return Encode(view.data(), view.size());
		}
コード例 #5
0
ファイル: BinaryWriter.hpp プロジェクト: Siv3D/OpenSiv3D
		/// <summary>
		/// ファイルにデータを書き込みます。
		/// </summary>
		/// <param name="view">
		/// 書き込むデータ
		/// </param>
		/// <returns>
		/// 実際に書き込んだサイズ(バイト)
		/// </returns>
		int64 write(ByteArrayView view)
		{
			return write(view.data(), view.size());
		}