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