C#-算术溢出-通过gzipstream解压字符串
我在实现GZIP字符串解压器时遇到了一个问题。压缩字符串为a20d32fdda14b300b28aa6b72982af3b,如下所示。但是,运行此代码时,我收到以下错误:C#-算术溢出-通过gzipstream解压字符串,c#,gzipstream,C#,Gzipstream,我在实现GZIP字符串解压器时遇到了一个问题。压缩字符串为a20d32fdda14b300b28aa6b72982af3b,如下所示。但是,运行此代码时,我收到以下错误: “发生System.OverflowException HResult=0x80131516 Message=算术运算导致溢出。 StackTrace: 在GZipDecompressor.Decompress.Main(字符串[]args) " 执行以“byte[]buffer2”开头的行时 有人能解释一下为什么会发生这种
“发生System.OverflowException
HResult=0x80131516
Message=算术运算导致溢出。
StackTrace:
在GZipDecompressor.Decompress.Main(字符串[]args)
" 执行以“byte[]buffer2”开头的行时
有人能解释一下为什么会发生这种情况以及如何着手解决它吗
BitConverter.ToInt32(缓冲区,0)
产生的负值对数组分配无效。BitConverter.ToInt32(缓冲区,0)
产生的负值对数组分配无效。输入是否在前4个字节中包含原始未压缩数据的长度作为int?位转换器。ToInt32(缓冲区,0)
-缓冲区
是字节[24]…您如何确定输入字符串实际有效?它从哪里来的?然后检查,核实。首先通过将int(BitConverter.ToInt32(buffer,0)
)捕获到一个变量来重写程序,然后调试程序并检查得到的数字。你很可能得到一个非常大的数字。文件名包含加密数据的假设似乎很奇怪。更可能的情况是,这只是为保证文件名唯一而生成的guid。事实上,它是一个由十六进制数字组成的32个字符的字符串,这将支持这一理论,因为这与guid完全相同(除了guid通常以-
显示为单独的块,但它们可以很容易地剥离)。输入是否在前4个字节中包含原始未压缩数据的长度作为int?位转换器。ToInt32(缓冲区,0)
-缓冲区
是字节[24]…您如何确定输入字符串实际有效?它从哪里来的?然后检查,核实。首先通过将int(BitConverter.ToInt32(buffer,0)
)捕获到一个变量来重写程序,然后调试程序并检查得到的数字。你很可能得到一个非常大的数字。文件名包含加密数据的假设似乎很奇怪。更可能的情况是,这只是为保证文件名唯一而生成的guid。事实上,它是一个由十六进制数字组成的32个字符的字符串,这将支持这一理论,因为这与guid完全相同(除了guid通常以-
显示为单独的块,但它们很容易剥离)。这将给出与所示不同的异常消息。OP说它给出了“导致溢出的算术运算”,而负数(是的,它可以从显示的代码中复制)给出了“数组维度超出了支持的范围”@LasseV.Karlsen我也尝试过,在我的框中初始化一个长度为负的数组会给出导致溢出异常的算术运算,也是。看来负值一定在一个变量中。如果执行新建字节[-1]
操作,则会出现编译错误无法创建大小为负的数组。如果我做inttemp=-1;var数组=新字节[temp]代码>我得到溢出错误。@LasseV.Karlsen:我得到的数字是-551719573。如前所述为否定。这将给出与所示不同的异常消息。OP说它给出了“导致溢出的算术运算”,而负数(是的,它可以从显示的代码中复制)给出了“数组维度超出了支持的范围”@LasseV.Karlsen我也尝试过,在我的框中初始化一个长度为负的数组会给出导致溢出异常的算术运算,也是。看来负值一定在一个变量中。如果执行新建字节[-1]
操作,则会出现编译错误无法创建大小为负的数组。如果我做inttemp=-1;var数组=新字节[temp]代码>我得到溢出错误。@LasseV.Karlsen:我得到的数字是-551719573。如前所述,是否定的。
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));
}
}
}
}