Я новичок в .net. Я делаю сжатие и декомпрессию строки в C #. Существует XML, и я конвертирую в строку, и после этого я выполняю сжатие и декомпрессию. В моем коде нет ошибки компиляции, кроме случаев, когда я декомпрессирую свой код и возвращаю строку, возвращая только половину XML.
Ниже мой код, пожалуйста, поправьте меня, где я не прав.
Код:
class Program
{
public static string Zip(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();
}
public static string UnZip(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 decompress
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Decompress);
//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];
//Decompress
int rByte = sr.Read(byteArray, 0, byteArray.Length);
//Transform byte[] unzip data to string
System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
//Read the number of bytes GZipStream red and do not a for each bytes in
//resultByteArray;
for (int i = 0; i < rByte; i++)
{
sB.Append((char)byteArray[i]);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB.ToString();
}
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"D:\RSP.xml");
string val = doc.ToString(SaveOptions.DisableFormatting);
val = Zip(val);
val = UnZip(val);
}
}
Мой размер XML составляет 63 КБ.
c#
string
.net-2.0
compression
Мохит Кумар
источник
источник
using
.Encoding
неправильный путь. Вам нужен base-64 здесь, согласно ответу ксанатосаОтветы:
Код для сжатия / распаковки строки
Помните, что
Zip
возвращает abyte[]
, аUnzip
возвращает astring
. Если вам нужна строка,Zip
вы можете закодировать ее в Base64 (например, используяConvert.ToBase64String(r1)
) (результатZip
- ОЧЕНЬ двоичный файл! Это не то, что вы можете распечатать на экране или записать непосредственно в XML)Предлагаемая версия предназначена для .NET 2.0, для .NET 4.0 используйте
MemoryStream.CopyTo
.ВАЖНО: Сжатый контент не может быть записан в выходной поток, пока не
GZipStream
узнает, что у него есть все входные данные (т. Е. Для эффективного сжатия ему нужны все данные). Вы должны убедиться , что выDispose()
изGZipStream
перед осмотром выходного потока (например,mso.ToArray()
). Это делается с помощьюusing() { }
блока выше. Обратите внимание, чтоGZipStream
это самый внутренний блок и доступ к содержимому за его пределами. То же самое относится и к распаковке:Dispose()
изGZipStream
ранее попыток доступа к данным.источник
string s = "X\uD800Y"
. Я заметил, что это работает, если мы изменим кодировку на UTF7 ... но с UTF7 мы уверены, что все символы могут быть представлены?согласно этому фрагменту я использую этот код, и он работает нормально:
источник
С появлением .NET 4.0 (и выше) с методами Stream.CopyTo () я решил опубликовать обновленный подход.
Я также думаю, что приведенная ниже версия полезна в качестве наглядного примера автономного класса для сжатия обычных строк в строки, закодированные в Base64, и наоборот:
Вот еще один подход, использующий технику методов расширения для расширения класса String для добавления сжатия и распаковки строк. Вы можете поместить класс ниже в существующий проект и затем использовать таким образом:
и
Для остроумия:
источник
using
операторы для экземпляров MemoryStream. А для разработчиков F # там: воздерживаться от использования ключевого словаuse
для экземпляра compressorStream / decompressorStream, потому что они должны быть расположены вручную , прежде чемToArray()
будет вызванаЭто обновленная версия для .NET 4.5 и новее, использующая async / await и IEnumerables:
При этом вы можете сериализовать все
BinaryFormatter
, что поддерживает, а не только строки.Редактировать:
В случае, если вам нужно позаботиться
Encoding
, вы можете просто использовать Convert.ToBase64String (byte []) ...Посмотрите на этот ответ, если вам нужен пример!
источник
Convert.ToBase64String(byte[])
. Пожалуйста, посмотрите этот ответ ( stackoverflow.com/a/23908465/3286975 ). Надеюсь, поможет!Для тех, кто все еще получает Магическое число в заголовке GZip не правильно. Убедитесь, что вы передаете поток GZip. ОШИБКА и если ваша строка была заархивирована с помощью php, вам нужно сделать что-то вроде:
источник