Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.03.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.004 c
2-1370371622
oliksin
2013-06-04 22:47
2014.03.23
записи и файлы!


1-1323639179
RAD
2011-12-12 01:32
2014.03.23
Удалить файл, открытый другим процессом


2-1370193829
Вова
2013-06-02 21:23
2014.03.23
Работа с потоками вызов из потока процедур определенных вне его


15-1380905527
BBC
2013-10-04 20:52
2014.03.23
XML просмотрщик


2-1371628834
DanilTraum
2013-06-19 12:00
2014.03.23
Рекурсия с квадратом