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)


Ако искате да напишете конкретни байтове, трябва да използвате byte[] и т.н. API. Ако използвате Write(string) API, той кодира допълнителни данни за дължината на низа и т.н., които вероятно не искате. Честно казано, BinaryWriter не е много полезно в повечето сценарии - по-добре е да пишете на Stream и т.н., което ще ви ограничи до API, които правят това, което очаквате.

person Marc Gravell    schedule 01.04.2020