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

Вниз

Прочитать из "массива" в "массив"   Найти похожие ветки 

 
ZipFolder   (2006-08-26 16:42) [0]

Есть такой код:
 PZPkt = ^TZPkt;
 TZPkt = record
   Data: array[0..1024] of Byte;
   Len: Word;
 end;

var
  z1, z2: PZPkt;



z1 -- заполнен заранее, z1.Len - это показатель на сколько прочитан пакет (т.е когда мы читаем из него где-то, и увеличиваем Len на столько-же на сколько прочитали).

z2 -- пока пустой пакет.

Необходимо прочитать из z1, в z2 необходимое количество. Вопрос: покажите, как это корректно и хорошо сделать. А то я сделаю, как всегда через одно известное место...
Спасибо!


 
Джо ©   (2006-08-26 16:58) [1]

Move


 
ZipFolder   (2006-08-26 17:31) [2]

А можно ближе к мой ситуации? Я сам пробовал различные манипуляции с Move, но видимо дурак от природы, маловато знаю. Даже если чего и добьюсь - то это будет заведомо не оптимально, поэтому и прошу помощи. Спасибо!


 
Джо ©   (2006-08-26 17:41) [3]

Move (z1^.Data,z2^.Data,z1^.Len);
z2^.Len := z1^.Len;


 
ZipFolder   (2006-08-26 17:59) [4]

Я напишу все же свой ход мыслей.

Допустим У нас в z1, находится 50 байт. z1.Len -- изначально установлен в 0.
Мы читаем где-то из z1, например 10 байт, и увеличиваем z1.Len на прочитанное (т.е.) 10 байт.

Потом нам приспичило с текущей позиции (z1.Len) отправить 20 байт в z2.
Так будет нормально? Не хочет что-то. Сейчас изучаю отладчиком...

function MovePkt2Pkt(Pkt: PZPkt; Size: Word): TZPkt;
begin
 Move (Pkt^.Data, Result.Data, Size);
 Inc(Pkt^.Len, Size);
 Result.Len := 0;
end;


 
Джо ©   (2006-08-26 18:08) [5]

Честно скажу, мало что понял в вопросе. Точнее, почему поле Len (сокр. длина) хранит " это показатель на сколько прочитан пакет". В общем, скажу, раз ветка в "Начинающих", что Move копирует указанное кол-во байт из одной области памяти в другую. Приспосабливайте ее, как знаете :)


 
default ©   (2006-08-26 18:24) [6]

может так?
function MovePkt2Pkt(Pkt: PZPkt; Size: Word): TZPkt;
begin
Move (Pkt^.Data[Pkt^.Len], Result.Data, Size);
Inc(Pkt^.Len, Size);
Result.Len := 0;
end;

а если серьёзно, то ЯВНО надо не так делать...скорее всего лучше сделать всё stream-о подобными классами, быть может взяв за базовый TStream или как-то ещё, но через классы


 
ZipFolder   (2006-08-26 18:24) [7]

Я наверное запутал не слишком нужными фактами. Поэтому, переформирую вопрос в немного другое русло, может быть понятнее получиться.

Мне нужно считать из в z2.Data, из z1.Data, с началом в z1.Len, нужное количество Size.

т.е. например задано
Size = 6;
z1.Data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
z1.Len = 4;
Move(z1,... z2...)
В z2, должно получиться: (5, 6, 7, 8, 9, 10)

Сделал так, работает, но может быть есть вариант лучше?
Move (Pkt^.Data[Pkt^.Len], Result.Data, Size);



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.058 c
2-1156838861
Postalll
2006-08-29 12:07
2006.09.17
Вызов приложения из командной строки


2-1157006229
Интересующийся
2006-08-31 10:37
2006.09.17
Выбор значения в поле TDBGrid


15-1156694224
Griha
2006-08-27 19:57
2006.09.17
Скрыть от приложения деактивацию его окна (WM_ACTIVATE)


15-1156138331
default
2006-08-21 09:32
2006.09.17
Задачка


8-1135860481
Cr@zy-EyE
2005-12-29 15:48
2006.09.17
Не запускается Direct3d