Zlib-совместимые потоки сжатия?

Вы также можете использовать метод compareTo() для сравнения двух строк. Если результат compareTo равен 0, то две строки равны, в противном случае сравниваемые строки не равны.

== сравнивает ссылки и не сравнивает фактические строки. Если вы создали каждую строку, используя new String(somestring).intern(), вы можете использовать оператор == для сравнения двух строк, в противном случае могут использоваться только методы equals () или compareTo.

13
задан Ben Collins 16 September 2008 в 08:25
поделиться

7 ответов

От MSDN о Системе. IO.Compression. GZipStream:

Этот класс представляет gzip формат данных, который использует алгоритм промышленного стандарта для сжатия файла без потерь и распаковки.

От zlib FAQ:

gz* функции в zlib, с другой стороны, используют формат gzip.

, Таким образом, zlib и GZipStream должен быть совместимым, но только если Вы используете функции zlib для обработки gzip-формата.

Система. IO.Compression. Выкачайте и zlib по сообщениям не совместимы.

, Если необходимо обработать zip-файлы (Вы, вероятно, не делаете, но кому-то еще, возможно, понадобилось бы это), необходимо использовать SharpZipLib или другая сторонняя библиотека.

9
ответ дан Rasmus Faber 16 September 2008 в 08:25
поделиться
  • 1
    Делает Вас, сценарий развертывания тогда удаляет файл однажды it' s сделанный? – Charlino 20 May 2010 в 04:26

Они просто сжатие данных с помощью zlib или выкачивает алгоритмы, но не обеспечивает вывод для некоторого определенного формата файла. Это означает, что при хранении потока как есть к жесткому диску по всей вероятности Вы не будете в состоянии открыть его с помощью некоторого приложения (gzip или winrar), потому что заголовки файлов (магическое число, и т.д.) не включены в поток, который Вы должны записать им сами.

2
ответ дан Andreas Bakurov 16 September 2008 в 08:25
поделиться
  • 1
    @incrediman, стек находится только в памяти наряду со всем остальным, таким образом, можно получить доступ к нему однако, Вы хотите. It' s только стек в смысле использования его для хранения контекста выполнения для вызовов функции и так далее. – Carl Norum 1 March 2010 в 01:46

gzip, выкачивают + некоторые данные заголовка/нижнего колонтитула, как контрольная сумма и длина, и т.д. Таким образом, они не совместимы в том смысле, что один метод может использовать поток от другого, но они используют тот же алгоритм сжатия.

3
ответ дан Lasse Vågsæther Karlsen 16 September 2008 в 08:25
поделиться
  • 1
    Да можно читать из стека без нажатия/поп: Вам просто нужны указатель вершины стека и смещение. В x86 asm указатель вершины стека содержится в регистре ESP, таким образом, можно использовать esp+offset (на самом деле при разборке приложения C Вы будете видеть, что этот метод раньше получал доступ к ' local' переменные в рамках вызова функции). – slugster 1 March 2010 в 01:45

Я соглашаюсь с andreas. Вы, вероятно, не будете в состоянии открыть файл во внешнем инструменте, но если тот инструмент ожидает поток, Вы могли бы быть в состоянии использовать его. Вы также были бы в состоянии выкачать файл назад с помощью того же класса сжатия.

0
ответ дан configurator 16 September 2008 в 08:25
поделиться
  • 1
    Регистр, хранящий переменную, похож на устройство хранения данных памяти переменная, кроме: a) регистра не имеет никакого адреса памяти (верный для всех современных процессоров), b) его быстрее к доступу, и управляйте, чем переменная памяти, c) его использует меньше байтов инструкции (более короткие инструкции) для обращения, чем переменная памяти и d) существует очень небольшое количество регистров в любой архитектуре ЦП, где-нибудь приблизительно 2, 8, 16, или 32 для процессоров CISC, и 32 - 128 для процессоров RISC, тогда как могут быть миллиарды переменных памяти сразу. – wallyk 1 March 2010 в 01:59

Я использовал 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 (вероятно, информация заголовка, как другие заявили в этом потоке). Это различие, однако, кажется, не имеет значение на практике.

6
ответ дан Isak Savo 16 September 2008 в 08:25
поделиться
  • 1
    +1 Еще раз спасибо Carl. Очень полезный! Особенно пример на 3 был полезен. Я предполагаю, когда это действительно сводится к нему, блок должен отличаться, чем C, иначе это на самом деле был бы сам C. Для № 4... Я думал, что стек был строго методом "первым пришел - первым вышел". Однако я предполагаю, что можно читать из стека, не продвигая/выталкивая тогда? Кроме того, я нашел это, которое кажется полезным и релевантным: en.wikibooks.org/wiki/X86_Disassembly/… – Cam 1 March 2010 в 01:36

DotNetZip включает DeflateStream, ZlibStream, и GZipStream, для обработки RFC 1950, 1951, и 1952. Все использование ВЫКАЧИВАТЬ Алгоритм, но байты структурирования и заголовка отличается для каждого.

Как преимущество, потоки в DotNetZip не показывают аномалия расширения размера данных при сжатии, сообщил против встроенных потоков. Кроме того, нет никакого встроенного ZlibStream, тогда как DotNetZip дает Вам что для хорошего interop с zlib.

14
ответ дан Cheeso 16 September 2008 в 19:25
поделиться
  • 1
    нет, я оставляю его там поэтому, когда я развертываю новый код, я могу снова включить его – Andrew Bullock 25 February 2011 в 11:07

Я столкнулся с этой проблемой с объектами Git. В этом конкретном случае они сохраняют объекты как спущенные капли с заголовком Zlib, что описано в RFC 1950 . Вы можете создать совместимый большой двоичный объект, создав файл, содержащий:

  • Два байта заголовка (CMF и FLG из RFC 1950) со значениями 0x78 0x01
    • CM = 8 = deflate
    • CINFO = 7 = окно 32 КБ
    • FCHECK = 1 = биты контрольной суммы для этого заголовка
  • Вывод C # DeflateStream
  • Контрольная сумма Adler32 входных данных для 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;
        }
    }
}

. И на этом все.

16
ответ дан 1 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: