Вы также можете использовать метод compareTo()
для сравнения двух строк. Если результат compareTo равен 0, то две строки равны, в противном случае сравниваемые строки не равны.
==
сравнивает ссылки и не сравнивает фактические строки. Если вы создали каждую строку, используя new String(somestring).intern()
, вы можете использовать оператор ==
для сравнения двух строк, в противном случае могут использоваться только методы equals () или compareTo.
От MSDN о Системе. IO.Compression. GZipStream:
Этот класс представляет gzip формат данных, который использует алгоритм промышленного стандарта для сжатия файла без потерь и распаковки.
От zlib FAQ:
gz* функции в zlib, с другой стороны, используют формат gzip.
, Таким образом, zlib и GZipStream должен быть совместимым, но только если Вы используете функции zlib для обработки gzip-формата.
Система. IO.Compression. Выкачайте и zlib по сообщениям не совместимы.
, Если необходимо обработать zip-файлы (Вы, вероятно, не делаете, но кому-то еще, возможно, понадобилось бы это), необходимо использовать SharpZipLib или другая сторонняя библиотека.
Они просто сжатие данных с помощью zlib или выкачивает алгоритмы, но не обеспечивает вывод для некоторого определенного формата файла. Это означает, что при хранении потока как есть к жесткому диску по всей вероятности Вы не будете в состоянии открыть его с помощью некоторого приложения (gzip или winrar), потому что заголовки файлов (магическое число, и т.д.) не включены в поток, который Вы должны записать им сами.
gzip, выкачивают + некоторые данные заголовка/нижнего колонтитула, как контрольная сумма и длина, и т.д. Таким образом, они не совместимы в том смысле, что один метод может использовать поток от другого, но они используют тот же алгоритм сжатия.
Я соглашаюсь с andreas. Вы, вероятно, не будете в состоянии открыть файл во внешнем инструменте, но если тот инструмент ожидает поток, Вы могли бы быть в состоянии использовать его. Вы также были бы в состоянии выкачать файл назад с помощью того же класса сжатия.
Я использовал GZipStream для сжатия вывода от.NET XmlSerializer, и это работало превосходное для распаковки результата с gunzip (в cygwin), winzip и другой GZipStream.
Для ссылки, вот то, что я сделал в коде:
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
serializer.Serialize(gzStream, myData);
}
Затем для распаковки в c#
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
using (Stream input = new GZipStream(fs, CompressionMode.Decompress))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
myData = (MyDataType) serializer.Deserialize(input);
}
Используя утилиту 'файла' в cygwin показывает, что существует действительно различие между тем же файлом, сжатым с GZipStream и с GNU GZip (вероятно, информация заголовка, как другие заявили в этом потоке). Это различие, однако, кажется, не имеет значение на практике.
DotNetZip включает DeflateStream, ZlibStream, и GZipStream, для обработки RFC 1950, 1951, и 1952. Все использование ВЫКАЧИВАТЬ Алгоритм, но байты структурирования и заголовка отличается для каждого.
Как преимущество, потоки в DotNetZip не показывают аномалия расширения размера данных при сжатии, сообщил против встроенных потоков. Кроме того, нет никакого встроенного ZlibStream, тогда как DotNetZip дает Вам что для хорошего interop с zlib.
Я столкнулся с этой проблемой с объектами Git. В этом конкретном случае они сохраняют объекты как спущенные капли с заголовком Zlib, что описано в RFC 1950 . Вы можете создать совместимый большой двоичный объект, создав файл, содержащий:
0x78 0x01
CM
= 8 = deflate CINFO
= 7 = окно 32 КБ FCHECK
= 1 = биты контрольной суммы для этого заголовка DeflateStream
DeflateStream
, формат с прямым порядком байтов (сначала MSB) Я сделал свою собственную реализацию Adler
public class Adler32Computer
{
private int a = 1;
private int b = 0;
public int Checksum
{
get
{
return ((b * 65536) + a);
}
}
private static readonly int Modulus = 65521;
public void Update(byte[] data, int offset, int length)
{
for (int counter = 0; counter < length; ++counter)
{
a = (a + (data[offset + counter])) % Modulus;
b = (b + a) % Modulus;
}
}
}
. И на этом все.