首页 > 解决方案 > 解码 UTF-16 编码的十六进制字节后得到奇怪的问号

问题描述

我正在使用BinaryReader类的实例从文件中读取十六进制字节数组,我需要从 UTF-16 解码它。据我所知,我需要使用System.Text.Encoding.Unicode.GetString(byte[] array).

这就是我的代码的样子:

public static string ReadHex(string path, Int32 startOffset, Int32 endOffset, bool decode, bool utf16)
{
    if (!File.Exists(path))
    {
        throw new FileNotFoundException($"Could not find a file in path {path}");
    }

    string result = "";
    List<byte> bytes = new List<byte>();
    BinaryReader br = new BinaryReader(File.OpenRead(path));

    for (int i = startOffset; i < endOffset; i++)
    {
        br.BaseStream.Position = i;
        bytes.Add(br.ReadByte());
    }

    br.Close();
    if (decode && utf16)
    {
        result = System.Text.Encoding.Unicode.GetString(bytes.ToArray());
    }
    else if (decode)
    {
        result = System.Text.Encoding.UTF8.GetString(bytes.ToArray());
    }
    else 
    {
        foreach (byte b in bytes)   
        {
            result += b.ToString("X2");
        }
    }
    return result;
}

它读取参数提供的给定十六进制偏移量,并在需要时对其进行解码。UTF-8 部分完美运行,为我提供了有效的解码字符串。但我的问题在于 UTF-16 部分。这是从文件中读取的数据:

4D 00 6F 00 6A 00 61 00 6E 00 67 00 20 00 41 00 42
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00

理论上,这是应该输出的: Mojang AB

它有点工作,但有一个奇怪的是,这是编写该方法返回的字符串时输出的内容:

Mojang AB ?

这些问号出现在我放入该方法的任何 UTF-16 上。我不明白它们为什么会出现,因为传入的数据System.Text.Encoding.Unicode.GetString(byte[] array)不包含超出它应该包含的字符串的任何内容,并且由零 ( 00) 组成。有人知道为什么会这样吗?

标签: c#

解决方案


推荐阅读