Почему BinaryReader.ReadDecimal () возвращает неправильное значение? - PullRequest
0 голосов
/ 08 апреля 2019

Я сохранил значения типа данных в файл, затем использовал его, но я получил неправильный результат. Что мне нужно сделать, чтобы получить правильный результат?

        BinaryWriter bw = new BinaryWriter(file.OpenWrite());
        string str = "Lalisa";
        int num = 10;
        decimal dec = 2;
        bw.Write(str);
        bw.Write(num);
        bw.Write(dec);
        bw.Close();

        BinaryReader br = new BinaryReader(file.OpenRead());
        Console.WriteLine(br.ReadString()); 
        Console.WriteLine(br.ReadInt16());
        Console.WriteLine(br.ReadDecimal());
        br.Close();

        /*
         output:
         Lalisa
         10
         131072
         */

Пишущий вывод

produced file by the writer

Примечание * Я использую класс FileInfo для потока. Цель этого исследования - я не пытаюсь решить задачу для проекта.

1 Ответ

4 голосов
/ 08 апреля 2019

Проблема заключается в следующей строке

Console.WriteLine(br.ReadInt16());

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

Вы должны иметь

Console.WriteLine(br.ReadInt32());

Это должно решить вашу проблему

Объяснение:

Байты записаны в формате Little Endian, поэтому 10 int и 2 decimalнаписаны следующим образом.Квадратные скобки предназначены для обозначения начала и конца int и decimal

[0A 00 00 00] [02 00 00 00...00]

Но когда вы читаете int как просто 16-битное значение, это то, как вы сгруппируете биты вчитать

[0A 00] [00 00 02 00 00 00...00]

Как вы можете заметить, int не страдает в этом процессе и все еще читается как 0x000A, но десятичное число сдвинуто на 2 байта, переключая его с 0x02 на0x020000, то есть 131702 в десятичном виде

Если бы формат был прямым порядком байтов, вы бы увидели, что int получает неправильное значение 0x00

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