【问题标题】:String to zip file压缩文件的字符串
【发布时间】:2016-06-15 14:31:14
【问题描述】:

我使用了一个 web 服务,它返回一个 zip 文件,作为一个字符串,而不是我预期的字节。我试图将它写入磁盘,但是当我打开它时,它告诉我它已损坏。我做错了什么?

string cCsv = oResponse.fileCSV;//this is the result from webservice
MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(cCsv));
using (FileStream file = new FileStream("test.zip", FileMode.Create, FileAccess.Write))
{
    ms.WriteTo(file);
}
ms.Close();

【问题讨论】:

  • 您能在向您的网络服务询问此 csv 文件的位置添加一些代码吗?
  • 如果不知道应该如何解释 cCsv 字符串,就无法回答您的问题。听起来你也不知道。关于 Web 服务返回的内容,您有任何更正式的信息/规范吗?
  • 您无法通过 Web 服务传递原始二进制数据,因此您的响应以某种方式进行了文本编码(例如 BASE64)。您必须先将文本数据解码回二进制。
  • 如果 zip 文件以字符串形式返回,那么它可能是以某种文本格式编码的。您需要对其进行解码(以取回字节),然后将其写入文件。
  • 也许可以尝试打印或写入字符串,或者只是在其上使用一个停止点来查看它的外观和使用的字符。这会给你一个关于它的编码类型的想法。我认为UTF-8 然后UTF-16 会是很好的第一和第二猜测。

标签: c# io


【解决方案1】:

我不确定字符串的编码类型,但假设UTF-8,以下应该可以工作。 UTF-16 是另一个猜测。

string cCsv = oResponse.fileCSV;
using (BinaryWriter bw = new BinaryWriter(File.Create("test.zip")))
{
    bw.Write(System.Text.Encoding.UTF8.GetBytes(cCsv));
}

查看返回的字符和原始字符串本身会提供丰富的信息。

编辑

根据 Frank 的回答,正确的编码是 base64,这当然是有道理的,因为它是以字符串形式存储的二进制数据。

另外,根据 Frank 的回答,如果唯一的操作是直接写入单字节数组,那么 File.WriteAllBytes 更紧凑。

【讨论】:

  • 是的,我什么都试过了,UTF 16不存在,我用的是UTF32,但是我收到的错误总是打开文件:未知格式
  • 好吧,看来你用Base64解决了,直接写字节数组简化了代码。 Base64 非常有意义,因为它是将二进制数据存储为字符串,derp,我应该首先建议 :( 仅供参考,UTF-16 确实存在,但是.Net 令人困惑,因为它调用 UTF-16 “Unicode”,这完全是误导,因为 UTF-32 也是 Unicode,但 UTF-16 是 .Net 的默认值。只是需要注意的事情。
【解决方案2】:

好的,我解决了这个问题:

File.WriteAllBytes("testbase64.zip", Convert.FromBase64String(cCsv));

【讨论】:

  • 这看起来不错,使用 Base64 并使用 WriteAllBytes 直接写入字节...你应该接受这个作为答案。
  • 我试图接受作为答案,但我收到了超过 21 小时的消息.....
  • 哦,是的,因为您是 answering your own question,您需要等待 48 小时后才能接受。
猜你喜欢
  • 2020-04-12
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多