【问题标题】:How to convert compressed (high-order byte removed) bytes to Unicode string?如何将压缩(删除高位字节)字节转换为 Unicode 字符串?
【发布时间】:2018-06-05 15:08:05
【问题描述】:

我有一个表示为字节数组的字符串,我知道该字符串已删除了0x00 的高位字节,因此该字符串被压缩为:

0x43 0x6F 0x6D 0x6D 0x61 0x6E 0x64 //"Command"

如何将字节转换为 Unicode 字符串?

我猜我需要每隔一秒将字节复制到一个大小为两倍的新数组 (uncompressedBytes) 中:

byte[] compressedBytes = br.ReadBytes(stringLength);
byte[] uncompressedBytes = new byte[stringLength * 2];
for (int byteCounter = 0; byteCounter < stringLength; byteCounter++)
{
    uncompressedBytes[byteCounter * 2] = compressedBytes[byteCounter];
}
return Encoding.Unicode.GetString(uncompressedBytes);

或者是否有一种编码将所有字节视为缺少高位字节的 Unicode 字符?

【问题讨论】:

    标签: c# arrays string unicode character-encoding


    【解决方案1】:

    如果您知道所有字节都是0x7f 或更少,您可以将它们视为utf-8 并使用System.Text.UTF8Encoding 转换器类。

    【讨论】:

    • 很遗憾,我不知道所有字节都是 0x7f 或更小。
    • 剥离较大 Unicode 值的高位字节会损坏数据。 Unicode 中没有压缩,当然也不是简单地截断字节的压缩。所以,如果所有字节都是 0x7F 和更低,那么您就有了与 UTF-8 兼容的 ASCII。如果你有 0x80-0xFF 之间的任何字节,那么你正在处理 ANSI,很可能是 ISO-8859-1,但也可能是 Windows-1252 或其他编码
    【解决方案2】:

    前 256 个代码点与 ISO-8859-1 的内容相同,以便轻松转换现有的西方文本。

    https://en.m.wikipedia.org/wiki/Unicode

    Encoding.GetEncoding("ISO-8859-1").GetString(bytes)
    

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多