【问题标题】:Consistent Byte Representation of invalid chars无效字符的一致字节表示
【发布时间】:2017-12-17 09:36:09
【问题描述】:

抱歉,如果有人回答了这个问题,但如果有,我找不到。

我正在对字节数组进行一些操作,并注意到在转换无效字符(例如,字节 0x9C)时,它被解释为“?”。因此,当我将它转换回一个字节时,它会输出为 0x3F。

我的问题是字节数​​组的一部分是 ASCII,但其他部分是校验和,可能包含像这样的无效字符。为了方便起见,我希望能够将整个数组转换为字符串。是否有一种编码可以为普通字符产生 ASCII 并确保将无效字符转换为字符串并返回将产生相同的字节?

【问题讨论】:

    标签: .net arrays string encoding byte


    【解决方案1】:

    可能对其他人不起作用,但我发现通过使用

    System.Text.Encoding.Default.GetString(...)
    

    System.Text.Encoding.Default.GetBytes(...)
    

    与其他编码相反,防止字节数组中的值更改为“?”和 ASCII 字符仍然被正确解释。

    【讨论】:

    • 仍有一些值会导致您获取无效数据。如果您需要将 byte[] 表示为字符串,您应该使用 Convert.ToBase64String(Convert.FromBase64String( 此外,如果您计划在计算机之间发送数据,System.Text.Encoding.Default 可能因系统而异。只需将校验和设为自己的 byte[] 并将它们的 base64 文本附加到字符串的末尾即可。
    • 默认值因机器、用户和时间而异。它很少是正确的选择,但可能有机会在问题中描述的来回转换的上下文中工作。
    • 我应该补充一下,我发现我的机器上的默认设置是 System.Text.Encoding.SBCSCodePageEncoding,并更改了代码以指定它。它很可能仍然提供无效数据,但到目前为止它工作正常
    【解决方案2】:

    不确定“普通字符”是什么意思,但您要求的编码可以解码任意字节值 0-255 的任意序列。它需要用于具有 256 个代码点的字符集,具有 1 字节代码单元,在一个代码单元中编码所有代码点,位于 .NET 基类库中,并且字符集是 Unicode 的子集。

    ISO 8859-1 和 CP437 是满足这些要求的两个。您可以检查它们是否将您的“普通字符”映射到 Unicode 中的“普通字符”。 (提示:ISO 8859-1 与 C0 Control and Basic Latin 和 C1 Controls 和 Latin-1 Supplement 块具有所有相同的字符。)

    顺便说一句——你确定你的数据格式区域是用 ASCII 编码的文本而不是其他字符编码吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2015-01-01
      • 2012-12-31
      • 1970-01-01
      • 2022-01-18
      • 2018-07-23
      • 1970-01-01
      相关资源
      最近更新 更多