Я сохранил значения типов данных в файле, а затем использовал их, но получил неверный результат. Что мне нужно сделать, чтобы получить нужный результат?
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
*/
Выход писателя
Примечание. Я использую класс FileInfo для потока. Целью этого является изучение. Я не пытаюсь решить проблему для проекта.
@jdweng Я ни к чему не подключаюсь. Я просто использую редактор Visual Studio и запускаю его в консоли.
одна проблема - вы пишете int32, но читаете int16
@vik_78 Это просто решило неправильный результат! Как это повлияло на ReadDecimal?
@RonaldAbellano, потому что вы только что прочитали 2 байта в ReadInt16 вместо 4 байтов. И эти 2 байта были прочитаны в ReadDecimal
@RonaldAbellano - как только вы прочитали неправильный объем данных из потока, любые чтения последующий также будут смещены.
Проблема в строке ниже
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
или измените int num = 10;
на short num = 10;
Спасибо, это решило это. Но как повлияло на следующую строку? Он должен возвращать неправильный результат в строке int, верно? Просто любопытно.
@RonaldAbellano - предположим, что у вас есть 10 яблок и 5 человек, каждый из которых хочет по 2 яблока, но второй человек берет 4 из 10 яблок и выбрасывает лишние 2, так как ему нужны только 2, поэтому оставшимся людям придется иметь дело с тем, что осталось.
STX — начало сообщения. Вы возвращаете все нули. Вы подключаетесь через МОДЕМ или SMS? У вас по какой-то причине нет хорошей связи.