У меня возникла проблема с реализацией распаковщика строк GZIP. Сжатая строка имеет вид a20d32fdda14b300b28aa6b72982af3b, как показано ниже. Однако при запуске этого кода я получаю сообщение об ошибке:
«Возникло исключение System.OverflowException
HResult = 0x80131516
Сообщение = Арифметическая операция привела к переполнению.
StackTrace:
в GZipDecompressor.Decompress.Main (String [] args)
"
при выполнении строки, начинающейся с "byte[] buffer2"
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
namespace GZipDecompressor
{
class Decompress
{
public static void Main(string[] args)
{
string compressedText = "a20d32fdda14b300b28aa6b72982af3b";
int length = compressedText.Length;
byte[] buffer = Convert.FromBase64String(compressedText);
using (MemoryStream stream = new MemoryStream())
{
stream.Write(buffer, 4, buffer.Length - 4);
byte[] buffer2 = new byte[BitConverter.ToInt32(buffer, 0)];
stream.Position = 0;
using (GZipStream stream2 = new GZipStream(stream, CompressionMode.Decompress))
{
stream2.Read(buffer2, 0, buffer2.Length);
}
Console.WriteLine(Encoding.UTF8.GetString(buffer2));
}
}
}
}
Не мог бы кто-нибудь объяснить, почему это происходит и как это решить.
BitConverter.ToInt32(buffer, 0)
-buffer
- это байт [24] ... - person dovid   schedule 27.06.2017ToInt32
вернет число, состоящее из первых четырех байтов в массиве. Я предполагаю, что это сделано намеренно, и именно поэтому поток памяти пропускает первые четыре байта (потому что они имеют другое назначение). Если вы думаете, что что-то не так, вам следует сказать, что это, вместо того, чтобы быть расплывчатым ... - person Chris   schedule 27.06.2017BitConverter.ToInt32(buffer, 0)
) в переменную, затем отладьте свою программу и проверьте, какое число вы получили. Скорее всего, вы получите действительно большое число. - person Lasse V. Karlsen   schedule 27.06.2017compressedText
действительно закодирован в base64? Похоже, что он содержит только шестнадцатеричные символы. - person C.Evenhuis   schedule 27.06.20170x1f 0x8b
. Ваша строка не содержит этих байтов, будь то сырые, в виде шестнадцатеричной строки или декодированные как Base64. Вам нужно будет внимательнее взглянуть на то, что производит эту строку. Также обратите внимание, что ZIP не является GZip. - person Jeroen Mostert   schedule 27.06.2017-
для разделения блоков, но их можно легко удалить). - person Chris   schedule 27.06.2017