C#decode(解压缩)缩小PDF文件的数据
我想在C#中解压缩一些DeflateCoded数据(PDF提取)。 不幸的是,我每次都遇到exception“解码时发现无效数据”。 但数据是有效的。
private void Decompress() { FileStream fs = new FileStream(@"S:\Temp\myFile.bin", FileMode.Open); //First two bytes are irrelevant fs.ReadByte(); fs.ReadByte(); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); StreamToFile(d_Stream, @"S:\Temp\myFile1.txt", FileMode.OpenOrCreate); d_Stream.Close(); fs.Close(); } private static void StreamToFile(Stream inputStream, string outputFile, FileMode fileMode) { if (inputStream == null) throw new ArgumentNullException("inputStream"); if (String.IsNullOrEmpty(outputFile)) throw new ArgumentException("Argument null or empty.", "outputFile"); using (FileStream outputStream = new FileStream(outputFile, fileMode, FileAccess.Write)) { int cnt = 0; const int LEN = 4096; byte[] buffer = new byte[LEN]; while ((cnt = inputStream.Read(buffer, 0, LEN)) != 0) outputStream.Write(buffer, 0, cnt); } }
有人有想法吗? 谢谢。
我为测试数据添加了这个: –
private static void Compress() { FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Create); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Compress); for (byte n = 0; n < 255; n++) d_Stream.WriteByte(n); d_Stream.Close(); fs.Close(); }
修改后的解压缩如下: -
private static void Decompress() { FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Open); //First two bytes are irrelevant // fs.ReadByte(); // fs.ReadByte(); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); StreamToFile(d_Stream, @"C:\Temp\myFile1.txt", FileMode.OpenOrCreate); d_Stream.Close(); fs.Close(); }
就像这样: -
static void Main(string[] args) { Compress(); Decompress(); }
并没有错误。
我得出结论,前两个字节是相关的(显然它们与我的特定测试数据有关。)或者您的数据有问题。
我们可以提供一些测试数据吗?
(显然不要,如果它是敏感的)
private static string decompress(byte[] input) { byte[] cutinput = new byte[input.Length - 2]; Array.Copy(input, 2, cutinput, 0, cutinput.Length); var stream = new MemoryStream(); using (var compressStream = new MemoryStream(cutinput)) using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress)) decompressor.CopyTo(stream); return Encoding.Default.GetString(stream.ToArray()); }
感谢user159335和user1011394让我走上正轨! 只需将流的所有字节传递给上述函数的输入。 确保bytecount与指定的长度相同。