【问题标题】:convert binary file to text将二进制文件转换为文本
【发布时间】:2013-12-06 11:02:36
【问题描述】:

我有一个程序以二进制格式从 url 获取响应,但我不知道如何将其转换为文本文件。

byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postString);
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();

response = (HttpWebResponse)request.GetResponse();
Stream ReceiveStream = response.GetResponseStream();
string filename = "C:\\responseGot.txt";

byte[] buffer = new byte[1024];
FileStream outFile = new FileStream(filename, FileMode.Create);
int bytesRead;
while ((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0) 
    outFile.Write(buffer, 0, bytesRead);

当我打开 responseGot.txt 时,它是一个二进制文件,我如何获取文本文件。

【问题讨论】:

  • 您不会展示如何编写文件,但您必须知道二进制文件的格式才能将其转换为文本。如果是 UTF-8,请尝试 Encoding.UTF8.GetString()
  • @CodeCaster,这就是我的写作方式。字节[]缓冲区=新字节[1024]; FileStream outFile = new FileStream(filename, FileMode.Create); int bytesRead; while ((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0) outFile.Write(buffer, 0, bytesRead);
  • 回答了我一半的评论。你确定字节应该代表文本吗?然后在适当的编码类上调用GetString()

标签: c# httpwebresponse


【解决方案1】:

您收到的回复是什么格式的? 没有文本文件。只有二进制文件。 HTTP 也是 100% 二进制的。

文本是字节的解释,它只作为运行应用程序的一部分存在。您可以永远将文本写入文件。您只能将文本转换为字节(使用各种方式)并写入字节。

因此,问问自己为什么 notepad.exe 无法将收到的字节解释为文本。也许响应不是直接的文本,而是一个 ZIP 文件或其他东西。

  1. 你可以用十六进制编辑器猜出格式
  2. 你可以问问站长

【讨论】:

  • 你太棒了...节省了我的一天,感谢您的解释。保存为 zip 文件,瞧,它可以工作
  • 将 HttpWebRequest.AutomaticDecompression 设置为 true 以自动执行此操作。 Web 服务器的响应很可能只是 gzip 压缩(使用 Content-Encoding)。这是标准的 HTTP 功能。
【解决方案2】:

您没有在代码示例中显示将文件保存在任何地方。

但是要将响应转换为字符串,您可以使用:

   using (HttpWebResponse response = req.GetResponse() as HttpWebResponse)   
    {  
      StreamReader reader = new StreamReader(response.GetResponseStream());
      string ResponseTXT = reader.ReadToEnd();
    }

然后你可以用通常的技巧来保存它 http://msdn.microsoft.com/en-us/library/6ka1wd3w%28v=vs.110%29.aspx

你是这个意思吗?

【讨论】:

  • 问题似乎是接收到的字节与可读文本不对应。 StreamReader 会像 notepad.exe 一样读取垃圾。
【解决方案3】:

如今,数字计算中表示的每个数据都基于 2 位,即。二进制(电/磁信号:开/关或北/南)。 每个写入磁盘的文件也是一个二进制文件,即。 (8位)字节序列。 ASCII/ANSI 为每个字节序列定义了字符映射,256 个字节中只有大约 95 个被称为可打印(文本)字符。

您下载的文件似乎不仅仅是可打印的字符(通常称为纯文本文件)。 要按原样查看文件(在您当前的编码设置中):

type <file.ext>

在不同的代码页中查看:

chcp <codepage>
type <file.ext>

要查看文件的(纯)文本表示,您首先要对其进行编码(即将其转换为文本文件),例如。通过一些十六进制编辑器的十六进制编码字符串。 十六进制序列的前几个字符应给出magic number,指示正在读取的文件类型。然后,您将使用关联的程序(能够打开这些类型的文件)打开文件。

如果它您所期望的文本文件,但得到的文件不仅仅是可打印(纯文本)字符,那么它更有可能已经对其应用某种压缩/加密。再一次,幻数应该暗示应该如何处理文件,例如。在尝试读取数据/文件之前解压缩。 (加密文件应带有解密提示/密钥,除非之前交换/同意)

【讨论】:

    【解决方案4】:

    使用本主题中的ReadFully方法Creating a byte array from a stream

    将字符串表示为一个实际的字符串:

    string text = System.Text.Encoding.Default.GetString(byteArray);
    

    最后创建文本文件并写入内容:

    using(StreamWriter sw = new StreamWriter("C:\\responseGot.txt"))
    {
            sw.WriteLine(text);
    }
    

    【讨论】:

    • 您将字节转换为字符串,然后转换为相同的字节。它不会改变任何东西。
    • 我正在将Stream 转换为bytes 的数组,然后将数组解码为string,最后将字符串写入文本文件。按照这个顺序,我什么时候重新转换将字符串转换为字节数组?
    • StreamWriter 会这样做。
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多