Форум: "Начинающим";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];
ВнизTReader error: Invalid property value Найти похожие ветки
← →
Cobalt © (2013-06-01 18:07) [0]
procedure BytesToWareRec(Arr: TBytes; var ARec: TLPCustomWareRec);
var
str: TMemoryStream;
rd: TReader;
begin
str := TMemoryStream.Create;
str.Write(Arr, Length(Arr));
str.Seek(0, 0);
rd := TReader.Create(str, Length(Arr));
try
ARec.Model := rd.ReadInteger;
ARec.PLU := rd.ReadInteger;
ARec.WareType := rd.ReadInteger;
ARec.CertCenter := rd.ReadString;
ARec.MessageText := rd.ReadString;
finally
rd.Free;
str.Free;
end;
end;
может, я что не так делаю?
Опыта работы с TReader"om нет.
← →
Медвежонок Пятачок © (2013-06-01 22:03) [1]чтобы читать тридером и ни о чем не паритьтся, сначала надо писать трайтером.
← →
Алканавт расправил плечи (2013-06-02 00:09) [2]То, что ты написал, это скорее работа для TMemIniFile. А TReader для несколько иных вещей предназначен.
← →
Cobalt © (2013-06-02 01:34) [3]Пишу, есс-но, райтером. Полностью код:
http://pastebin.com/9TBeLihK
← →
Германн © (2013-06-02 02:39) [4]
> Cobalt © (02.06.13 01:34) [3]
>
> Пишу, есс-но, райтером.
А не приходило в голову, что "эта граната не той системы"?
← →
Cobalt © (2013-06-02 09:18) [5]Просто хотел не писать велосипед, и воспользоваться готовым.
Может, ты знаешь какое-то ограничение, которое не знаю я?
← →
Медвежонок Пятачок © (2013-06-02 09:29) [6]Пишу, есс-но, райтером. Полностью код:
А вот это тогда что за хрень:
begin
str := TMemoryStream.Create;
str.Write(Arr, Length(Arr));
str.Seek(0, 0);
rd := TReader.Create(str, Length(Arr));
......
← →
Cobalt © (2013-06-02 10:31) [7]Записываю в Memorystream массив,
указатель в начало
создаю ридер по потоку.
← →
Юрий Зотов © (2013-06-02 11:50) [8]> Cobalt © (02.06.13 10:31) [7]
Запись через MemoryStream.Write и через TWriter не обязательно дадут одно и то же бинарное содержимое потока. А TReader понимает только тот формат, в котором пишет TWriter.
Вывод - если читаешь через TReader, то писать надо через TWriter. И при этом еще не забыть про WriteListBegin и WriteListEnd, раз уж пишется массив.
← →
Медвежонок Пятачок © (2013-06-02 13:59) [9]Записываю в Memorystream массив,
Тебе и говорят, чтобы читать ридером, надо писать райтером.
← →
Cobalt © (2013-06-02 14:04) [10]Я ссылку дал не просто так, а из-за ограничения форума на длину сообщения
← →
Медвежонок Пятачок © (2013-06-02 14:09) [11]И тебе не просто так сказали, что если читаешь ридером, то и писать надо райтером.
← →
Anatoly Podgoretsky © (2013-06-02 14:20) [12]> Cobalt (02.06.2013 14:04:10) [10]
А ты что “Войну и Мир”
собрался публиковать?
← →
sniknik © (2013-06-03 10:39) [13]> str.Read(Arr[0], str.Size)
> str.Write(Arr, Length(Arr));
???
← →
Cobalt © (2013-06-03 12:26) [14]Ну вот, хоть один человек помнит, как правильно передавать динамический массив в параметр
const Buffer
← →
Медвежонок Пятачок © (2013-06-03 12:59) [15]остальные просто не смотрели этот момент за ненадобностью.
потому что даже если динамический массив интегеров правильно записать в стрим через write, то ридером через ридинтегер один фик ничего не прочитаешь.
ридер читая интегер (и не только его) ждет, что интегер (и не только он) был записан райтером.
а райтер, записывая интегер, сначала пишет маркет типа, а затем уже значение самого интегера.
вот и ридер при считывании интегера считывает сначала маркер, а затем уже четыре байта интегера.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c