0

1 つのアルゴリズムを操作して、C# で長い文字列と短い文字列の両方を圧縮したいのですが、試したすべてのアルゴリズムは長い文字列を圧縮できましたが、短い (約 5 文字) は圧縮できませんでした。コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.IO;
using System.Collections;
using System.Text;

namespace CompressString {
internal static class StringCompressor
{
    /// <summary>
    /// Compresses the string.
    /// </summary>
    /// <param name="text">The text.</param>
    /// <returns>compressed string</returns>
    public static string CompressString(string text)
    {
        byte[] buffer = Encoding.Default.GetBytes(text);
        MemoryStream ms = new MemoryStream();
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
        {
            zip.Write(buffer, 0, buffer.Length);
        }
        ms.Position = 0;
        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);
        byte[] gzBuffer = new byte[compressed.Length + 4];
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
        return Encoding.Default.GetString(gzBuffer);
    }

    /// <summary>
    /// Decompresses the string.
    /// </summary>
    /// <param name="compressedText">The compressed text</param>
    /// <returns>uncompressed string</returns>
    public static string DecompressString(string compressedText)
    {
        byte[] gzBuffer = Encoding.Default.GetBytes(compressedText);
        using (MemoryStream ms = new MemoryStream())
        {
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
            byte[] buffer = new byte[msgLength];
            ms.Position = 0;
            using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
            {
                zip.Read(buffer, 0, buffer.Length);
            }
            return Encoding.Default.GetString(buffer);
        }
    }
}}

行の圧縮解除メソッドで InvalidDataException (デコード中に無効なデータが見つかりました) を取得しました: zip.Read(buffer, 0, buffer.Length); あなたは何を提案していますか?

4

2 に答える 2

0

5 文字を圧縮する必要がある特別な要件はありますか?
そうしないと、CPU とメモリを無駄に使用することになります: 5 文字でスペースを獲得する可能性は非常に低くなります (4 文字に減らすには 4%、3 文字に減らすには 0.1% など)、文字列ができる場合はさらに少なくなります。異なる大文字と小文字、句読点、特殊文字などが含まれています)

于 2013-04-30T11:34:35.600 に答える