BinaryWriter Неправильно записывает два дополнительных байта C#

Во-первых, вот мой метод записи по указанным смещениям, я прошел процесс отладки, и все устанавливается соответствующим образом.

Например, я установил для pokemonValue значение 190, затем оно преобразуется в 0xBE и затем записывается в смещение по offsetArray[i] == 0x1D104 Ожидаемое поведение состоит в том, что он просто запишет 0xBE по этому смещению. Это не так. вместо этого он пишет 0x02 0x42 0x45 в 0x1D104 0x1D105 0x1D106 соответственно.

        public void writeStarterPokemon(long[] offsetArray, BinaryWriter writer, int pokemonValue)
        {
            string hexVal = "";
            for (int i = 0; i < offsetArray.Length; i++)
            {
                writer.BaseStream.Position = offsetArray[i];
                hexVal = string.Format("{0:X}", pokemonValue); // pokemonValue is a decimal ranging from 0-255;
                MessageBox.Show(string.Format("Hex val: 0x{0:1X}, Offset: 0x{1:X5}", hexVal, offsetArray[i])); // to see if the values are correct
                writer.Write(hexVal);
                writer.Flush();
            }
        }

Вот пример используемого массива и того, как вызывается метод

private long[] squirtleOffsets = new long[] { 0x1D104, 0x1D11F, 0x24BA5, 0x26FBC};

writeStarterPokemon(sqrtlOffsets, writer, NameList.SelectedIndex); 
// NameList is the name of my comboBox populated with pokemon data, 0-255

Я проверил свои смещения, и они верны, и ранее в программе я читал из них, что работает так, как задумано. Поэтому я не уверен, почему это работает неправильно или, скорее, устанавливает неверные данные.


person David    schedule 01.04.2020    source источник
comment
BinaryWriter добавляет к строкам префикс их длины, отсюда и 0x02. Похоже, что вы хотите на самом деле написать значение BINARY, а не строку вообще. Всегда ли pokemonValue находится в диапазоне 0..255?   -  person Matthew Watson    schedule 01.04.2020
comment
@MatthewWatson А, хорошо, это имеет смысл. Да, всегда в этом диапазоне.   -  person David    schedule 01.04.2020
comment
В этом случае вы можете попробовать writer.Write((byte)pokemonValue); или использовать writer.BaseStream.WriteByte((byte)pokemonValue);   -  person Matthew Watson    schedule 01.04.2020
comment
@MatthewWatson writer.BaseStream.WriteByte((byte)pokemonValue); Я использовал это, и это сработало, спасибо!!   -  person David    schedule 01.04.2020
comment
@David, обычно не рекомендуется смешивать и сопоставлять такие API - во многих случаях буферизация вас укусит   -  person Marc Gravell    schedule 01.04.2020


Ответы (1)


Если вы хотите записать определенные байты, вам нужно использовать API byte[] etc. Если вы используете Write(string) API, он кодирует дополнительные данные для длины строки и т. д., которые вам, вероятно, не нужны. Откровенно говоря, BinaryWriter не очень полезен в большинстве сценариев — вам лучше написать Stream и т. д., что ограничит вас API, которые делают то, что вы ожидаете.

person Marc Gravell    schedule 01.04.2020