标签: deflatestream

使用Deflate压缩和解压缩字符串

我需要压缩和解压缩字符串

这是代码:

public static byte[] ZipStr(String str)
{
    using (MemoryStream output = new MemoryStream())
    using (DeflateStream gzip = new DeflateStream(output, CompressionMode.Compress))
    using (StreamWriter writer = new StreamWriter(gzip))
       {
                writer.Write(str);
                return output.ToArray();
       }
}
Run Code Online (Sandbox Code Playgroud)

public static string UnZipStr(byte[] input)
{
    using (MemoryStream inputStream = new MemoryStream(input))
    using (DeflateStream gzip = new DeflateStream(inputStream, CompressionMode.Decompress))
    using (StreamReader reader = new StreamReader(gzip))
       {
        reader.ReadToEnd();
        return System.Text.Encoding.UTF8.GetString(inputStream.ToArray());
       }
}
Run Code Online (Sandbox Code Playgroud)

似乎UnZipStr方法中存在错误.有人能帮助我吗?

.net c# deflatestream

15
推荐指数
1
解决办法
3万
查看次数

GZipStream和DeflateStream会生成更大的文件

我正在尝试在C#中使用deflate/gzip流,但看起来压缩后的文件比以前更大.

例如,我压缩了900ko的docx文件,但它产生了1.4Mo!

它为我尝试过的每个文件都做到了.

我做错的方式可能是我错了吗?这是我的代码:

  FileStream input = File.OpenRead(Environment.CurrentDirectory + "/file.docx");
  FileStream output = File.OpenWrite(Environment.CurrentDirectory + "/compressedfile.dat");

  GZipStream comp = new GZipStream(output, CompressionMode.Compress);

  while (input.Position != input.Length)
      comp.WriteByte((byte)input.ReadByte());

  input.Close();

  comp.Close(); // automatically call flush at closing
  output.Close();
Run Code Online (Sandbox Code Playgroud)

c# gzipstream deflatestream

9
推荐指数
1
解决办法
4710
查看次数

DeflateStream不解压缩数据(第一次)

所以这是一个奇怪的.我有这个方法来采取Base64编码的缩小字符串并返回原始数据:

public static string Base64Decompress(string base64data)
{
    byte[] b = Convert.FromBase64String(base64data);
    using (var orig = new MemoryStream(b))
    {
        using (var inflate = new MemoryStream())
        {
            using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
            {
                ds.CopyTo(inflate);
                return Encoding.ASCII.GetString(inflate.ToArray());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个空字符串,除非我添加第二个调用ds.CopyTo(inflate).(WTF?)

   ...
            using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
            {
                ds.CopyTo(inflate);
                ds.CopyTo(inflate);
                return Encoding.ASCII.GetString(inflate.ToArray());
            }
   ...
Run Code Online (Sandbox Code Playgroud)

(Flush/ Close/ Disposeds没有任何效果.)

为什么DeflateStream第一次调用时复制0个字节?我也尝试过循环Read(),但它在第一次调用时也返回零,然后在第二次调用时工作.


更新:这是我用来压缩数据的方法.

public static string Base64Compress(string …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 deflatestream

8
推荐指数
1
解决办法
8112
查看次数

单声道无法压缩?

我试图压缩像单声道这样的一些数据:

public static string Save(FlightProgram program, bool compressed)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter f = new BinaryFormatter();
        if (compressed)
        {
            using (DeflateStream gz = new DeflateStream(ms, CompressionMode.Compress))
            {
                f.Serialize(gz, program);
            }
        }
        else
        {
            f.Serialize(ms, program);
        }
        return Convert.ToBase64String(ms.ToArray()).Replace('/', '_');
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是得到异常"CreateZStream".没有内在的例外.这里发生了什么 ?

堆栈跟踪:

Could not save flight program: CreateZStream at   at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode …
Run Code Online (Sandbox Code Playgroud)

c# mono deflatestream unity-game-engine

7
推荐指数
2
解决办法
3274
查看次数

使用 SQL 读取 Dynamics NAV 表元数据

我希望能够直接从 SQL Server 数据库读取Dynamics NAV 2013 表元数据,而无需 NAV 开发环境

我可以使用如下查询查看二进制 SQL“图像”BLOB 列(使用 WHERE 子句进行适当的过滤):

SELECT 
    o.[Name],
    m.[Object Type],
    m.[Metadata], -- XML Metadata
    m.[User Code], -- C# Metadata
    m.[User AL Code] -- C/AL Metadata
FROM [Navision].[dbo].[Object Metadata] AS m
JOIN [Navision].[dbo].[Object] AS o
ON m.[Object ID] = o.[ID]
AND o.[Company Name] = 'YourCompanyName'
AND o.[Type] = 0 -- 0 is NAV Table Object Type
Run Code Online (Sandbox Code Playgroud)

我可以使用 .Net 代码或带有 SQL 驱动程序的快速脚本将来自 [元数据]、[用户代码] 和 [用户 AL 代码] 的二进制数据保存到文件中。我尝试使用 7-zip 解压缩,使用十六进制编辑器查看,以及 …

t-sql blob zlib deflatestream dynamics-nav

6
推荐指数
1
解决办法
2万
查看次数

为什么我的DeflateStream无法通过TCP正确接收数据?

我在本地计算机上的客户端和服务器设置上有一个TcpClient类.我一直在使用网络流来促进2成功之间的来回通信.

继续前进我试图在通信中实现压缩.我尝试过GZipStream和DeflateStream.我决定专注于DeflateStream.但是,连接暂停而不读取数据.

我尝试了4种不同的实现,由于服务器端没有读取传入数据和连接超时,所有实现都失败了.我将重点介绍我最近尝试过的两个实现,据我所知应该可行.

客户端分解为此请求:有两个单独的实现,一个没有编写器.

textToSend = ENQUIRY + START_OF_TEXT + textToSend + END_OF_TEXT;

// Send XML Request
byte[] request = Encoding.UTF8.GetBytes(textToSend);

using (DeflateStream streamOut = new DeflateStream(netStream, CompressionMode.Compress, true))
{
    //using (StreamWriter sw = new StreamWriter(streamOut))
    //{
    //    sw.Write(textToSend);
    //    sw.Flush();
    streamOut.Write(request, 0, request.Length);
    streamOut.Flush();
    //}
}
Run Code Online (Sandbox Code Playgroud)

服务器接收请求,我做
1.)快速读取第一个字符,然后它是否符合我的预期
2.)我继续阅读其余的.

第一次读取工作正常,如果我想读取整个流,它就在那里.但是我只想读取第一个字符并对其进行评估,然后在我的LongReadStream方法中继续.

当我尝试继续读取流时,没有要读取的数据.我猜测数据在第一次读取时丢失了,但我不知道如何确定. 当我使用普通的NetworkStream时,所有这些代码都能正常工作.

这是服务器端代码.

private void ProcessRequests()
{
    //  This method reads the first byte of data correctly and if I want to
    // I can read the entire request …
Run Code Online (Sandbox Code Playgroud)

c# tcpclient deflatestream

6
推荐指数
1
解决办法
356
查看次数

C#自定义序列化/反序列化与DeflateStreams一起使用

我正在尝试对对象进行自定义序列化/反序列化,以及使用DeflateStreams压缩/解压缩序列化数据.我最初为更复杂的对象做了这个,但是把它剪下来试图找出问题,然而它变得更加令人费解,因为它仍然存在.这是要序列化/反序列化的类:

[Serializable]
    public class RandomObject : ISerializable
    {
        public String Name { get; set; }
        public String SavePath { get; set; }

        public RandomObject()
        {
        }

        public RandomObject(String name, String savepath)
        {
            Name = name;
            SavePath = savepath;
        }

        public RandomObject(SerializationInfo info, StreamingContext context)
            : this(info.GetString("name"), info.GetString("savepath"))
        {
        }
        [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("name", Name);
            info.AddValue("savepath", SavePath);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里是应该序列化它的代码(似乎工作):

BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, …
Run Code Online (Sandbox Code Playgroud)

c# serialization deflatestream deserialization

5
推荐指数
1
解决办法
7754
查看次数

原始流有数据,Deflate 返回零字节

我正在读取数据(碰巧是一个 adCenter 报告),该数据应该是压缩的。使用普通流读取内容,我得到了几千字节的乱码,所以这似乎是合理的。所以我将流提供给 DeflateStream。

首先,它报告“块长度与其补码不匹配”。简短的搜索表明存在一个双字节前缀,实际上,如果我在打开 DeflateStream 之前调用 ReadByte() 两次,异常就会消失。

但是,DeflateStream 现在根本不返回任何内容。我花了整个下午的大部分时间来寻找线索,但没有运气。帮助我,StackOverflow,你是我唯一的希望!谁能告诉我我错过了什么?

这是代码。当然,在测试时我一次只启用两个注释块之一。

_results = new List<string[]>();
using (Stream compressed = response.GetResponseStream())
  {
  // Skip the zlib prefix, which conflicts with the deflate specification
  compressed.ReadByte();  compressed.ReadByte();

  // Reports reading 3,000-odd bytes, followed by random characters
  /*byte[]  buffer    = new byte[4096];
  int     bytesRead = compressed.Read(buffer, 0, 4096);
  Console.WriteLine("Read {0} bytes.", bytesRead.ToString("#,##0"));
  string  content   = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  Console.WriteLine(content);*/

  using (DeflateStream decompressed = new DeflateStream(compressed, CompressionMode.Decompress))
    {
    // Reports reading 0 bytes, and …
Run Code Online (Sandbox Code Playgroud)

.net c# zip stream deflatestream

5
推荐指数
1
解决办法
3038
查看次数

是否可以使用.NET DeflateStream进行pdf创建?

我正在玩通过C#代码创建pdf文件的能力.我一直在研究PDF规范,并且能够创建一个可用的PDF文件,通过使用UTF8编码将数据串和编码成字节数组来完成.

我遇到的问题是当我尝试使用DeflateStreampdf流对象时.它似乎不起作用:

这是有问题的pdf对象的文本版本(\ r \n是在每行的末尾,这里不可见):

5 0 obj
<</Length 45>>
stream
BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET
endstream
endobj
Run Code Online (Sandbox Code Playgroud)

当我尝试使用DeflateStream类来压缩行时BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET,pdf似乎不起作用.我注意到许多其他库如iTextSharp使用他们自己的Deflate压缩实现.

有没有理由说微软的DeflateStream类的实现不起作用?我是错误地使用它还是实现不正确或者是什么?


我知道PDF文件是二进制文件(不是文本文件),但如果我不加密任何内容,则可以将其全部视为文本.这是整个PDF文件供参考(在纯文本中,\ r \n也在每行的末尾,这里不可见):

%PDF-1.7
1 0 obj
<</Type /Catalog /Pages 2 0 R>>
endobj
2 0 obj
<</Type /Pages /MediaBox [ 0 0 200 200 ] /Count 1 /Kids [ 3 0 R ]>> …
Run Code Online (Sandbox Code Playgroud)

c# pdf deflatestream .net-4.5

5
推荐指数
1
解决办法
2129
查看次数

zip 内的 Zip 打开未记录的 System.IO.Compression.SubReadStream

我有一个用于聚合 zip 存档中的流的函数。

private void ExtractMiscellaneousFiles()
{
    foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
    {
        var fileEntry = _archive.GetEntry(miscellaneousFileName);
        if (fileEntry == null)
        {
            throw new ZipArchiveMissingFileException("Couldn't find " + miscellaneousFileName);
        }

        var stream = fileEntry.Open();
        OtherFileStreams.Add(miscellaneousFileName, (DeflateStream) stream);
    }
}
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下效果很好。但是,如果我在 zip 中包含 zip,则将流转换为 a 时会出现异常DeflateStream

System.InvalidCastException:无法将类型“System.IO.Compression.SubReadStream”的对象强制转换为类型“System.IO.Compression.DeflateStream”。

我无法找到SubReadStream. 我希望我的 zip 内的 zip 为DeflateStream. 这可能吗?如果是这样怎么办?

更新

仍然没有成功。我尝试了@Sunshine的建议,使用以下代码复制流:

private void ExtractMiscellaneousFiles()
{
    _logger.Log("Extracting misc files...");

    foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
    {
        _logger.Log($"Opening misc file stream for {miscellaneousFileName}"); …
Run Code Online (Sandbox Code Playgroud)

c# unzip stream deflatestream .net-core

5
推荐指数
1
解决办法
1934
查看次数