Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.042 c
15-1156829879
Slider007
2006-08-29 09:37
2006.09.17
Text Image


2-1156679246
Randomix
2006-08-27 15:47
2006.09.17
Видео Чат


2-1157012712
Perf2k2
2006-08-31 12:25
2006.09.17
Как лучше подключаться к MySQL через Delphi


11-1130388459
Trubis
2005-10-27 08:47
2006.09.17
Ещё вопросы (надеюсь последние) по ListView


1-1155039927
alexvan
2006-08-08 16:25
2006.09.17
Вопрос по TEdit




   Наверх