Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
ВнизПрочитать из "массива" в "массив" Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c