2011-06-28 4 views
3

私はDelphi 7を使用しています。プロシージャのどこかにあるか見つかったか教えてください。 CopyMemoryのように動作しますが、特定のバイト数の からメモリをコピーできます。私はTCPIP上の未送信のバイトを送信する必要があり、それは私がメモリに保存された未送信のバイトを抽出するために持っている理由ですので、私はこれを必要とdelphi CopyMemory fromインデックス

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

は、私は次のシグネチャで何かを必要とします。

私はソースを調べました。少しASMセクションを書き直す必要があります。 ..

おかげで、私は何年にASMを触れていないと私はむしろ信頼できる何かで滞在します!

+0

ありがとうございました!解決策はとてもシンプルで明白でした。私はそれを忘れてしまった。再度、感謝します。 – John

答えて

3
procedure CopyMemory(Src, Dest: Pointer; Len: Cardinal; Offset: Integer); 
var 
    OffsetSrc: ^Byte; 
begin 
    OffsetSrc := Src; 
    inc(OffsetSrc, Offset); 
    Move(OffsetSrc^, Dest^, Len); 
end; 

しかし、私は、私はおそらくヘルパー関数の外にポインタ演算を行うことを好むと思います。

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

を可動部を書き換えないでください:

0

コピーしたい最初のバイトのアドレスを渡すだけです。長さを調整してください。

擬似コード

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

は、あなたはまだだけソースポインタとして拳未送信バイトのアドレスを使用し、CopyMemoryを使用することができます。

4

あなたはこれを使用することができます。 VCLバージョンに依存してください。 必要に応じてFastCode versionを使用してください。

+1

@Johann FastCodeリンクをありがとう! :) –