【问题标题】:How to write binary text to file如何将二进制文本写入文件
【发布时间】:2022-01-04 17:03:20
【问题描述】:

我得到了一些可以是不同文件格式的二进制文本数据。 如何将其保存到“真实”文件中。

我尝试使用 BinaryWriter,但打开文件时它不正确,出现编码错误。我确实设置了编码。

https://docs.microsoft.com/en-us/dotnet/api/system.io.binarywriter?redirectedfrom=MSDN&view=net-6.0

如果需要,我可以稍后提供代码,但我不确定 binarywriter 是否是正确的类。

下面是word文档的二进制字符串(截断)

------=_Part_174495_1036280534.1637933726817
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename="Dummy_attachment_Ariba.docx"
Content-ID: <000D3A2BB3F41EEC928A7BA5E05A5B2C>
    PK    ! ?b\?x  ?  [Content_Types].xml ?(?                                                                    !jgs6?,+??v????Sz???*a???? ????b4?y??4?m????q?J3??R?p?Hj?^?w? ~=?p?,??+6=@!V??-??I?????????h)??|m???I?H??K??50~4??|??^h4A+H?"?(??o\P\9?*I???9??BKh???NB?4??dm?????3?????D??8w"l`??'?N??9????u'X????s?D17????M?sx6???T$uN??6[?õ??R?ta??I??d}????
    ?o??*?+??m????Of?  ?? PK    ! ?U~?   ?  _rels/.rels ?(?                                                    ??MK1???!?;?*"??^D?Md?C2????????(?.??3y??3C???+?4xW??(A??????yX?JB???Wp????b??#InJ????*?E?b?=[J???M?%???a ??????9m?.?????3???Y?  ?? PK    ! ??f1?  ?b?R???1?EF7Z?n???hY?jy??#1'?<???7
     word/document.xml??[o?0??'?? ?[CBsAM???=L???yr?V?E????C?Tt?/??|????????I??????? 2a"]??~~?????X$8??.?#5?????"N$?s*a?B???Y?b??(??3???[{M$Gr?e??B???0(??????8`?p?-? e?????e?Cn???? D8
???U    r^u@? x?!?#??di?%M???]?l?SN?[?RQ?[?9???)?X???
?
?'??^?????">?_5??????5?????:e?H?r!??jv8J???????Z?Pa????iU???q???W??O?+??F^?=?P???A?9Kn?? ??`BX??U6!?<?z??#o?z??U??{????h??_?[????w???3?Vp$pK??x??GPC??W???ªxn??Kx*ldrt???????i4~??v???h~?oWt???=?)1k?]5?Hp???G??y=?N?U~??@l??j?????b???{?6??J?J??????,W?V`Y??$?`?????"i$+????n??_B???.&85?p??"??2*?*???J8??(*=?,?l??Hk%o?9??f'?N???n??g?to?nG??|?   ?d?axW>iW=q?]3K?????????
  9  word/_rels/document.xml.rels ?(?                                                                            ???N?0??H???w?@A?N/?R??M6?"YG???c??PE=??c???Zu??@?C
?(?????J?[??y?XS?[C?`@???j???f???w»?SP3?OR???N???H??4???G[?^??B???SHO<YP`??-?l??oS?M??&?wH|&B~??????BV0#?<?CH???? 

【问题讨论】:

  • 哪个编码错误?
  • 什么是二进制文本? - 听起来很矛盾。
  • 您无法通过查看来知道二进制文件是否正确,除非您将其逐个字符(甚至不是)或者您是 Neo。关注错误。
  • @jps 我不知道 :-) 你会怎么称呼它?我在 POST 多部分请求中得到所谓的“文本”
  • @ThomasAdrian 将是有效负载、正文或任何其他术语。它不是“文本”,除非通过某种已知的文本编码(通常是 UTF8)知道它是文本

标签: c# binary


【解决方案1】:

BinaryWriter 几乎从来都不是任何工作的正确工具——它不像人们通常认为的那样。您可能想要的只是:Stream(即File.Create(...)。您将从...获取数据,无论它来自何处,并使用各种Write API 附加它,通常是块。

如果不知道数据是编码文本,那么任何时候你有stringchar[](或类似的)数据:你已经损坏了它,所以:不要那样做。保持纯粹的二进制。

如果数据已知是编码文本,但你不知道使用的精确编码,那么坦率地说:将其视为二进制。

除此之外:需要具体的例子来说明你在做什么。

【讨论】:

  • 谢谢,周末会提供一些代码
【解决方案2】:

问题实际上是它是什么编码。可能它已经损坏了。也许它是错误的方式,但因为它是一个单词文件,我会尝试通过检查所有可能的编码来强制它并尝试使用单词 api 打开文件,也许一个会工作或失败,但不会花那么长时间

var encodings = Encoding.GetEncodings().ToList();

encodings.ForEach(encoding =>
{
    File.WriteAllBytes($"{encoding.Name}.docx", Encoding.GetEncoding(encoding.Name).GetBytes(data));
});


encodings.ForEach(encoding =>
{
    try
    {
        /*to do: open $"{encoding.Name}.docx" with an word api*/
        Console.WriteLine($"{encoding.Name} works");
    }
    catch { }
});
Console.WriteLine("finished");
Console.ReadKey();

如果您可以控制发送部分,使用 base64 对我来说通常可以很好地处理 http 请求。但如果我理解正确,情况并非如此

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多