C# c语言中的压缩字符串#
我使用下面的代码来压缩2个字符串,它在压缩中工作得很好。但是,当我尝试解压缩第二个字符串时,如果第一个字符串很短(大约4个字符),我得到的块长度与其补码异常不匹配。 以下是我用于压缩的类:C# c语言中的压缩字符串#,c#,compression,C#,Compression,我使用下面的代码来压缩2个字符串,它在压缩中工作得很好。但是,当我尝试解压缩第二个字符串时,如果第一个字符串很短(大约4个字符),我得到的块长度与其补码异常不匹配。 以下是我用于压缩的类: using System; using System.IO; using System.IO.Compression; using System.Text; namespace CompressString { internal static class St
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
namespace CompressString {
internal static class StringCompressor
{
/// <summary>
/// Compresses the string.
/// </summary>
/// <param name="text">The text.</param>
/// <returns></returns>
public static string CompressString(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for compress
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write(byteArray, 0, byteArray.Length);
//Close, DO NOT FLUSH cause bytes will go missing...
sw.Close();
//Transform byte[] zip data to string
byteArray = ms.ToArray();
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
foreach (byte item in byteArray)
{
sB.Append((char)item);
}
ms.Close();
sw.Dispose();
ms.Dispose();
return sB.ToString();
}
/// <summary>
/// Decompresses the string.
/// </summary>
/// <param name="compressedText">The compressed text.</param>
/// <returns></returns>
public static string DecompressString(string sData)
{
byte[] byteArray = new byte[sData.Length];
int indexBa = 0;
foreach (char item in sData)
byteArray[indexBa++] = (byte)item;
MemoryStream memoryStream = new MemoryStream(byteArray);
GZipStream gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress);
byteArray = new byte[1024];
StringBuilder stringBuilder = new StringBuilder();
int readBytes;
while ((readBytes = gZipStream.Read(byteArray, 0, byteArray.Length)) != 0)
{
for (int i = 0; i < readBytes; i++) stringBuilder.Append((char)byteArray[i]);
} gZipStream.Close(); memoryStream.Close(); gZipStream.Dispose(); memoryStream.Dispose(); return stringBuilder.ToString();
}
}
压缩和解压缩方法应接受并返回字节数组。如果需要生成字符串输出,则可以将字节数组转换为base64字符串 例如:
// compress some string data
string stringData = GetSomeStringData();
// assumes the string data is UTF8 string - would work for ASCII encoding as well
byte[] uncompressedData = Encoding.UTF8.GetBytes(stringData);
byte[] compressedData = StringCompressor.Compress(uncompressedData);
// produce base64 encode string of compressed data
string compressedString = Convert.ToBase64String(compressedData);
// decompress base64 encoded string
// first convert to byte array
byte[] dataToDecompress = Convert.FromBase64String(compressedString);
byte[] decompressedData = StringCompressor.Decompress(dataToDecompress);
// encode decompressed data as a UTF8 encoded string
string decompressedString = Encoding.UTF8.GetString(decompressedData);
相应地重命名并调整Compress()和Decompress()方法。如果您真的希望有一个严格处理字符串的类,请在方法中嵌入base64编码/解码的逻辑。但是,如果您的类直接使用“byte[]”,那么您的代码将更加灵活,并且在其他实例中可以重用。您的压缩和解压缩方法应该接受并返回字节数组。如果需要生成字符串输出,则可以将字节数组转换为base64字符串 例如:
// compress some string data
string stringData = GetSomeStringData();
// assumes the string data is UTF8 string - would work for ASCII encoding as well
byte[] uncompressedData = Encoding.UTF8.GetBytes(stringData);
byte[] compressedData = StringCompressor.Compress(uncompressedData);
// produce base64 encode string of compressed data
string compressedString = Convert.ToBase64String(compressedData);
// decompress base64 encoded string
// first convert to byte array
byte[] dataToDecompress = Convert.FromBase64String(compressedString);
byte[] decompressedData = StringCompressor.Decompress(dataToDecompress);
// encode decompressed data as a UTF8 encoded string
string decompressedString = Encoding.UTF8.GetString(decompressedData);
相应地重命名并调整Compress()和Decompress()方法。如果您真的希望有一个严格处理字符串的类,请在方法中嵌入base64编码/解码的逻辑。但是,如果您的类直接使用“byte[]”,您的代码将更加灵活,在其他实例中可以重用。对于接收错误消息“块长度与其补码不匹配”的其他实例,如果您试图解压缩未压缩的文件,则可能会发生这种情况。对于收到错误消息“块长度与其补码不匹配”的其他人,如果您试图解压缩未压缩的文件,则可能会发生这种情况。我得到相同的“块长度与其补码不匹配”System.IO.InvalidDataException 我发现了以下信息: 它表示:“首先向前搜索2个字节。在泄密文件的开头有一个两字节的签名0x789c。” 如果跳过这两个字节,它应该可以工作 进一步资料: 和 我得到相同的“块长度与其补码不匹配。”System.IO.InvalidDataException 我发现了以下信息: 它表示:“首先向前搜索2个字节。在泄密文件的开头有一个两字节的签名0x789c。” 如果跳过这两个字节,它应该可以工作 进一步资料: 和
内置的.NET通缩算法是脆弱的,在任何情况下都不推荐使用-我不确定它在更新的版本中是否得到了改进(有人能澄清吗?)我想说使用SharpZipLib或类似的东西,只是作为初学者。你说的授权是什么意思?对不起,我是压缩算法的新手。。SharpZipLib能解决我的问题吗?我已经成功地使用了.NET内置的压缩算法。在核心部分,它们对于压缩/解压缩您直接控制的数据非常有用。内置的.NET压缩算法非常脆弱,在任何情况下都不推荐使用-我不确定它在更新的版本中是否有改进(有人能澄清吗?),首先,你说的补助金是什么意思?对不起,我是压缩算法的新手。。SharpZipLib能解决我的问题吗?我已经成功地使用了.NET内置的压缩算法。在核心部分,它们对于压缩/解压缩您直接控制的数据非常有用。不客气。如果答案让你的代码成功运行,你能接受答案吗?祝你好运不客气。如果答案让你的代码成功运行,你能接受答案吗?祝你好运你救了我一命,花了一天的时间找到了这个跳过的两个字节。你救了我一命,花了一天的时间找到了这个跳过的两个字节。