2012-10-19 4 views
3

두 개의 포인터 (입력 및 출력)를 사용하고 입력 바이트를 역순으로 출력에 쓰는 함수를 작성하려고했습니다. 지금까지 제대로 작동하지 못했습니다.Delphi 역순 정렬

procedure ReverseBytes(Source, Dest: Pointer; Size: Integer); 
var 
    Index: Integer; 
begin 
    Move(Pointer(LongInt(Source) + Index)^, Pointer(LongInt(Dest) + (Size - Index))^ , 1); 
end; 

누구든지이 작업을 수행하는 더 좋은 방법을 제안 할 수 있습니까?

감사합니다.

+5

나는 당신이 실제로 바이트를 반대로하고 싶지 내기 것입니다. 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하는 것이 좋습니다. 그것을 위해 모든 통신 라이브러리에 기능이 있습니다. 그것을 써. 그것은 당신의 코드를 더 논리적으로 정확하게 만들 것입니다. div 2와 shr 1의 차이점과 같습니다. 빅 엔디 언 머신에 코드를 삽입하면 두통을 줄일 수 있습니다. –

답변

1
procedure ReverseBytes(Source, Dest: Pointer; Size: Integer); 
var 
    Index: Integer; 
begin 
    for Index := 0 to Size - 1 do 
    Move(Pointer(LongInt(Source) + Index)^, 
     Pointer(LongInt(Dest) + (Size - Index - 1))^ , 1); 
end; 

procedure TForm2.Button2Click(Sender: TObject); 
var 
    s: AnsiString; 
    P: Pointer; 
begin 
    s := #0'testreverse'; 
    GetMem(P, Length(s)); 
    ReverseBytes(Pointer(s), P, Length(s)); 

    ShowMessage(PAnsiChar(P)); // esrevertset 
    FreeMem(P); 
end; 
+1

감사합니다. 나는 지금 내가 뭘 잘못하고 있는지 보았습니다. –

+0

왜 단순한 바이트 할당 대신 루틴 전체를 호출하는지 궁금합니다 - 교훈적인 목적입니까? 작은 수정 - ShowMessage (PAnsiChar (P))는 유니 코드 버전의 Delphi에서 더 좋습니다. – MBo

+0

@MBo - 제 의도는 원래 코드의 문제를 확인하는 것이 었습니다. PAnsiChar 수정에 감사드립니다. –

7
procedure ReverseBytes(Source, Dest: Pointer; Size: Integer); 
begin 
    Dest := PByte(NativeUInt(Dest) + Size - 1); 
    while (Size > 0) do 
    begin 
    PByte(Dest)^ := PByte(Source)^; 
    Inc(PByte(Source)); 
    Dec(PByte(Dest)); 
    Dec(Size); 
    end; 
end; 
+2

+1 명확하고 빠르며 효율적입니다. 또 다른 빠른 패턴은 바이트를 두 개 (양쪽 끝에서) 중간까지 반대로 할 수 있습니다. 그러나 다른 구현보다 훨씬 낫습니다. –