Delphi CopyMemory из индекса - PullRequest
       41

Delphi CopyMemory из индекса

3 голосов
/ 28 июня 2011

Я использую Delphi 7. Не могли бы вы сказать мне, если есть или можно найти где-нибудь процедуру который действует как: CopyMemory, но я бы мог скопировать память из конкретное количество байтов.

Мне нужно что-то со следующей подписью:

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD; fromByte: Integer);

Мне это нужно, потому что я должен отправить неотправленные байты через tcpip, и именно поэтому я должен извлечь неотправленные байты, хранящиеся в памяти.

Я посмотрел в источнике, и мне нужно было бы переписать небольшой раздел asm. Я не трогал Асма годами и предпочел бы остаться с чем-нибудь надежным ..

Спасибо!

Ответы [ 4 ]

4 голосов
/ 28 июня 2011

Вы можете использовать это:

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length, fromByte: Integer);
begin
  move(PAnsiChar(Source)[frombyte],PAnsichar(Dest)[frombyte],Length-fromByte);
end;

И не переписывайте движущуюся часть. Положитесь на версию VCL. Или используйте FastCode версию , если вам нужно.

3 голосов
/ 28 июня 2011
procedure CopyMemory(Src, Dest: Pointer; Len: Cardinal; Offset: Integer);
var
  OffsetSrc: ^Byte;
begin
  OffsetSrc := Src;
  inc(OffsetSrc, Offset);
  Move(OffsetSrc^, Dest^, Len);
end;

Но я думаю, что я бы предпочел сделать арифметику указателей вне вспомогательной функции.

1 голос
/ 28 июня 2011

Вы все еще можете использовать CopyMemory, просто используйте адрес первого неотправленного байта в качестве указателя источника.

0 голосов
/ 28 июня 2011

Просто передайте адрес первого байта, который вы хотите скопировать.Убедитесь, что вы отрегулировали длину.

Псевдокод :

var
  Dest   : TBytes;
  Source : TBytes;
...
SetLength (Dest, Length (Source) - FromByte);
CopyMemory (@Dest[0], @Source[FromByte], Length (Source) - FromByte);
...