Хеширование распакованных и сжатых файлов с помощью 7zip sdk — c#

Я использую 7z SDK для сжатия и распаковки файлов. Я хочу прочитать файл перед его сжатием, сгенерировать хэш sha256, записать в файл и сжать его.

При распаковке я буду читать хеш, сохранять его в переменной, распаковывать файл и получать новый хэш для сравнения с хешем, хранящимся в переменной, для проверки целостности файла.

При сжатии файла я включил этот блок:

            //Write the hash size from the original file
            int HashCodeSize = Hash.generateSHA256Hash(input).Length;
            byte[] hashSize = BitConverter.GetBytes(HashCodeSize);
            output.Write(hashSize, 0, hashSize.Length);

            //Write the hash from the original file
            byte[] fileHashCode = new byte[8];
            fileHashCode = Hash.generateSHA256Hash(input);
            output.Write(fileHashCode, 0, fileHashCode.Length);

При распаковке файла делаю так:

            //read the hash size from the original file
            byte[] hashSize = new byte[4];
            input.Read(hashSize, 0, 4);
            int sizeOfHash = BitConverter.ToInt16(hashSize, 0);

            //Read Hash
            byte[] fileHash = new byte[sizeOfHash];
            input.Read(fileHash, 0, 8);

Когда я включаю эти два блока, я получаю * необработанное исключение из SDK, без этих блоков программа работает отлично.

Вот как я генерирую хэш:

public static byte[] generateSHA256Hash(Stream fileSource)
{
    SHA256 fileHashed = SHA256Managed.Create();
    return fileHashed.ComputeHash(fileSource);
}

Кто-нибудь знает, что я делаю неправильно?

необработанное выполнение


person EAzevedo    schedule 03.08.2018    source источник
comment
I get an unhandled exception пожалуйста, добавьте сообщение и трассировку стека   -  person Renatas M.    schedule 03.08.2018
comment
Вероятно, вам нужно установить позицию потока в начало файла после записи. Попробуйте добавить output.Position = 0; после записи. Или вы используете разные потоки для записи и сжатия?   -  person Renatas M.    schedule 03.08.2018
comment
Я использую разные потоки. У меня есть два метода сжатия и распаковки файла.   -  person EAzevedo    schedule 03.08.2018
comment
хм, трудно представить, что вы на самом деле делаете в своем коде. Я только предполагаю, что вы знаете. Судя по коду на экране, я бы сказал, что у вас поврежден заголовок сжатого файла. Я бы трижды проверил и убедился, что вы используете правильный поток, в который пишете. Кстати, вы дважды вызываете generateSHA256Hash.   -  person Renatas M.    schedule 03.08.2018
comment
Возможно. Если я удалю хэш-блок, он сработает. Ошибка где-то там, я думаю. я просто не вижу что это такое   -  person EAzevedo    schedule 03.08.2018
comment
Можете ли вы опубликовать простой пример вашего фактического кода?   -  person Renatas M.    schedule 03.08.2018


Ответы (1)


Перемещение указателя на начало файла перед его записью решило мою проблему:

 input.Seek(0, SeekOrigin.Begin);
person EAzevedo    schedule 07.08.2018