我需要压缩和解压缩字符串
这是代码:
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方法中存在错误.有人能帮助我吗?
我正在尝试在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) 所以这是一个奇怪的.我有这个方法来采取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/ Dispose上ds没有任何效果.)
为什么DeflateStream第一次调用时复制0个字节?我也尝试过循环Read(),但它在第一次调用时也返回零,然后在第二次调用时工作.
public static string Base64Compress(string …Run Code Online (Sandbox Code Playgroud) 我试图压缩像单声道这样的一些数据:
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) 我希望能够直接从 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 解压缩,使用十六进制编辑器查看,以及 …
我在本地计算机上的客户端和服务器设置上有一个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) 我正在尝试对对象进行自定义序列化/反序列化,以及使用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) 我正在读取数据(碰巧是一个 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) 我正在玩通过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) 我有一个用于聚合 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)