Получение странных вопросительных знаков после декодирования шестнадцатеричных байтов в кодировке UTF-16 - PullRequest
0 голосов
/ 18 июня 2020

Я читаю шестнадцатеричный массив байтов из файла, используя экземпляр класса 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). Кто-нибудь знает, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...