튤립의 흥미로운 HTML [ HTML 이란 ]

[ 튤립의 흥미로운 HTML - HTML 이란 ]

[ 글을 읽기전 필독(http://tulipblog.egloos.com/21792) 를 참고해주세요. ]

안녕하세요. 저자 Tulip(hanbahoan@naver.com) 입니다.

언어를 한번 배워보셧다면 아시겠지만 언어는 보통이상으로 어렵죠

하지만 HTML은 초보자도 쉽게 배울수있기에 더욱 재밌습니다.

우선 기본적인 HTML 소스는

<html>
 <head>
  <title>HTML을 배웁시다.</title>
 </head>
 <body>
  HTML을 배워요.
 </body>
</html>

이겠죠. HTML은 "Tag" 라는 것에 통해 표시됩니다.

위에 보이는 소스처럼 "<html>" 이란 문장도 태그고

"<head>" 라는것도 태그입니다. 태그는 한번 열어주면

닫아줘야합니다. 하지만 닫지 않아도 되는 태그가 있지만.

소스를 좀더 가독성있게 하시려면 닫아주는게 좋겠죠.

자 이젠 HTML소스는 어떻게 해야 표기되느냐 ?

그게 의문점이죠. HTML은 메모장같은 텍스트에디터로 작성할수있습니다.

제 블로그에있는 [ 에디트 추천글 ] 을 보시면 됩니다.

저 소스를 복사( Ctrl + C ) 해서 붙여넣기( Ctrl + V ) 를 하시면 됩니다.


잘 안보이실태니 클릭해서 보시길 바랍니다.

그림에서 본것같이 저장할때 반드시 확장자를 html로 해주세요.

(파일형식과 인코딩도 동일하게)


약 실행해보면 이런 내용을 보실겁니다.

HTML은 [hyper text markup language]의약자 입니다.

사용자가 쉽게 편집할수도있죠.

다음에는 더욱 많은 태그를 배워보죠.





File List
첨부 파일 없음

by Tulip | 2008/01/27 00:33 | HTML | 트랙백 | 덧글(0)

Delphi - 웹 런처 방식의 피라미터 가로채기

[ Delphi - 피라미터 가로채기 ]

[ 글을 읽기전 필독(http://tulipblog.egloos.com/21792) 를 참고해주세요. ]



[1] 커맨드 라인 인자값 받기


ParamStr function

Index 번째 command-line 파라미터를 반환합니다.

 

Unit

System

 

Category

command line utilities

 

Delphi syntax:

function ParamStr(Index: Integer): string;

 

C++ syntax:

extern PACKAGE AnsiString __fastcall ParamStr(int Index);

 

Description

Index 번째 command-line 파라미터를 반환합니다.

Index 가 ParamCount 보다 클 경우 빈 문자열을 반환합니다.

예를들어, Index 가 2 이면 두번째 파라미터를 반환합니다.

Windows 에서 ParamStr(0) 은 실행파일의 FullName 을 반환합니다.

Linux 에서 ParamStr(0) 은 파라미터를 제외한 실행 명령을 반환합니다.

참고: 쌍 따옴표로 묶인 문자열은 하나의 파라미터로 취급됩니다.

 

-------------------------------------------------------------

위는 도움말 번역입니다.

커맨드라인 툴을 만들게 되면 파라미터가 거의 필수입니다.

온라인 게임중, 웹에서 접속하여 런쳐를 실행하는 방식의 경우

암호화된 인증문자열(ID/PASS 로 암호화된)을 파라미터로 전달하게되며

이를 가로채는 간단한 코딩으로 해킹이 가능해지는 황당한 일 도 있습니다.

(실제 모 온라인 게임에서 해보고 깜짝놀랐어요~)

 

몇가지 사용법을 적어보겠습니다.

1. 실행파일명(경로제외) 구하기

Str := ExtractFileName(ParamStr(0));

 

2. 실행경로명 구하기

Str := ExtractFilePath(ParamStr(0));

 

3. 실행파일과 이름이 같은 다른 파일명 구하기

Str := ChangeFileExt(ParamStr(0), '.ini');

 

4. 실행파일을 제외한 파라미터 전체 합치기

str := '';

for I := 1 to ParamCount do

  str := str + '"' + ParamStr(I) + '" ';

 

참고: ParamStr 의 Index 가 0 이면 실행파일명, 1..ParamCount 는 파라미터입니다.(ParamCouont - 1 아님)

 

추가: 파라미터에 공백이 있는경우 (Program Files 폴더명 같은경우) 그냥 넘겨주면 여러 파라미터로 인식하므로 " " 따옴표로 감싸줍니다.


[ 2 ] 파일 속성 변경하기


FileSetAttr function

-----------------

명시된 파일의 속성을 설정한다.

 

유닛

SysUtils

 

분류

파일 관리 루틴

 

델파이 문법:

function FileSetAttr(const FileName: string; Attr: Integer): Integer;

C++ 문법:

extern PACKAGE int __fastcall FileSetAttr(const AnsiString FileName, int Attr);

 

설명

FileSetAttr 은 FileName 이름의 파일 속성을 Attr 로 변경한다.

Attr 값은 파일 속성 상수의 조합으로 이루어진다, 다음 예를 보라:

 FileSetAttr('MyFile.sys', faReadOnly or faSysFile); // Delphi
 FileSetAttr("MyFile.sys", faReadOnly | faSysFile); // C++

FileSetAttr 이 성공적으로 끝나면 0 을 반환한다. 그 외에는 에러코드를 반환한다.

Note: FileSetAttr 은 Windows 에만 적용된다.

 

파일 속성 상수 (Constant = Value, Description)
faReadOnly = 1, Read-only files
faHidden = 2, Hidden files
faSysFile = 4, System files
faVolumeID = 8, Volume ID files
faDirectory = 16, Directory files
faArchive = 32, Archive files
faSymLink = 64, Symbolic link
faAnyFile = 71, Any file

 

예제) 자기 자신을 시스템파일, 숨김파일, 읽기전용 속성으로 세팅하기.

  FileSetAttr(ParamStr(0), faSystem or faHidden or faReadOnly);


[ 3 ] 문자열 처리하기 [ 1/2 ]

TStringList
-----------
TStringList 는 문자열 목록을 유지합니다.

유닛
Classes

설명
문자열 목록을 저장하고 다루기 위하여 문자열 목록 객체를 사용합니다.
TStringList 는 TStrings 의 추상 속성과 메소드,
● 목록의 문자열 정렬을 위한 새로운 속성, 이벤트, 그리고 메소드를 구현합니다.
● 정렬된 목록에서는 중복된 문자열을 금지합니다.
● 목록의 내용 변화에 응답합니다.
● 문자열 배치, 정렬, 그리고 확인 등의 중복 처리에 대소문자구분 또는 대소문자 비구분의 두가지 방법의 제어를 합니다.


(전체 속성, 메소드, 이벤트 설명은 제외합니다.)

---------------------------------------------------------------------------
Count 속성 (TStringList)
----------------------------
목록에 있는 문자열의 숫자를 나타냅니다.

Delphi 문법:
property Count: Integer;
C++ 문법:
__property int Count = {read=GetCount, nodefault};

설명
목록의 모든 문자열에 대한 반복, 또는 목록의 마지막 문자열의 위치와 상대적인 위치에 문자열을 위치시키기 위해 Count 를 사용합니다.
---------------------------------------------------------------------------
Strings 속성 (TStringList)
------------------------------
0 기반 인덱스로 문자열을 참조합니다.

Delphi 문법:
property Strings[Index: Integer]: string; default;
C++ 문법:
__property AnsiString Strings[int Index] = {read=Get, write=Put};

설명
부분적 위치의 문자열을 읽거나 수정하는데 Strings 를 사용합니다.
Index 는 문자열의 위치입니다, 0은 첫 문자열의 위치이고, 1은 두번째 문자열의 위치이며, 나머지도 동일 규칙입니다.
델파이에서, Strings 는 StringList 객체의 기본 속성입니다.
Strings 지시자는 생략될 수 있습니다.
예를들면, 아래 두줄의 코드는 서로 다르나 같은 역할을 합니다:
  MyStringList.Strings[0] := 'This is the first string';
  MyStringList[0] := 'This is the first string';

 

 

길어서 메소드와 예제 설명은 나눕니다~_~

설명은 TStringList 를 모두 설명하는 것이 아닌 자주쓰이는 또 설명할 필요가 있는 것만 도움말을 해석해 올립니다.

이 글을 다 외울 필요는 없고 시간나면 읽어 보시고, 아니면 이런 역할을 하는 객체구나, 이런 속성이 있구나만 읽고 넘어가시길...


[ 4 ] 문자열 처리하기 [ 2/2 ]

---------------------------------------------------------------------------
TStringList
---------------------------------------------------------------------------
Add 메소드 (TStringList)
------------------------
목록에 새로운 문자열을 추가합니다.

Delphi 문법:
function Add(const S: string): Integer; override;
C++ 문법:
virtual int __fastcall Add(const AnsiString S);

설명
S 에 입력된 문자열을 목록에 추가합니다.
목록이 정렬상태이면, S 는 정렬순서의 적절한 위치에 추가됩니다.
목록이 정렬상태가 아니라면, S 는 목록의 마지막에 추가됩니다.
Add 는 추가된 문자열의 위치를 반환합니다, 맨 처음에 추가되었다면 0을 반환합니다
참고: 정렬상태의 목록일때, S 가 이미 등록된 문자열과 동일하고 Duplicates 속성이 dupError 라면
Add 는 EListError 예외를 발생시킵니다.
Duplicates 가 dupIgnore 라면 Add 는 기존 문자열의 Index 를 반환합니다.
---------------------------------------------------------------------------
Clear 메소드 (TStringList)
--------------------------
목록의 모든 문자열을 제거합니다.

Delphi 문법:
procedure Clear; override;
C++ 문법:
virtual void __fastcall Clear(void);

설명
Clear 호출은 목록의 문자열을 모두 비웁니다.
모든 연결된 객체 또한 제거됩니다.
그러나, 객체는 스스로 Free 되지 않습니다.
(추가:StringList 이지만 TObject 형을 연결해서 추가할 수 있기 때문에 이 경우에 이런 상황이 발생하며, 따로 처리를 해줘야합니다.)
---------------------------------------------------------------------------
LoadFromFile 메소드 (TStrings)
------------------------------
명시된 파일에서 문자열 목록으르 불러옵니다.

Delphi 문법:
procedure LoadFromFile(const FileName: string); virtual;
C++ 문법:
virtual void __fastcall LoadFromFile(const AnsiString FileName);

설명
LoadFromFile 을 호출하면 FileName 에 명시된 파일에서 TStrings 객체 형식의 목록을 가져와서 채웁니다.
LoadFromFile 은 먼저 목록을 초기화합니다.
그런 다음, Carriage Return(#13) 또는 Linefeed(#10) 문자로 줄을 구분하여 각 줄을 목록에 추가합니다.
참고: LoadFromFile 은 내부적으로 문자를 추가하는데 Add 메소드를 이용합니다.
---------------------------------------------------------------------------
SaveToFile method (TStrings)
----------------------------
문자열 목록을 명시된 파일로 저장합니다.

Delphi 문법:
procedure SaveToFile(const FileName: string); virtual;
C++ 문법:
virtual void __fastcall SaveToFile(const AnsiString FileName);

설명
SaveToFile 호출은 FileName 에 명시된 파일에 문자열 목록을 저장합니다.
각 문자열은 파일에 라인으로 구분되어 저장됩니다.
리눅스에서, SaveToFile 은 목록에 나타난 그대로 저장됩니다.
만약 마지막 문자열이 end-of-line 마크로 끝자지 않을 경우,
결과 파일은 몇몇 에디터에서 완성되지 않았다고 판단될 것입니다.
(추가:이 부분은 리눅스에서 해보질 않아 저도 이해가 안되네요--;)
---------------------------------------------------------------------------


예제) FileName 에 명시된 파일 마지막에 Msg 에 넘어온 문자열을 추가하여 저장하기
procedure AppendFile(FileName, Msg: String);
var
  S: TStrings;
begin
  S := TStringList.Create;
  if S = nil then
    raise Exception.Create('메모리 쓰기 실패');

  try
    if FileExists(FileName) then
      S.LoadFromFile(FileName);
    S.Add(Msg);
    S.SaveToFile(FileName);
  finally
    S.Free;
  end;
end;

TStrings 형 변수에 TStringList 를 생성하는 것은 다형성의 개념이 적용되기 때문이겠죠.
델파이에서 문자열 객체는 대부분 TStrings 에서 상속받습니다. (아마 전부일 듯 합니다)
대표적인 예로 TMemo 의 Lines 속성이 TStrings 형 속성인데 내부적으로 TMemoStrings 형으로 생성됩니다.
TMemoStrings 는 TStringList 에 비해 기능이 좀 적은 듯 하네요.


이상 도움말 내용을 번역하다보니 저도 모르던 부분이 많이 나오네요.
특히 이번것은...ㅎㅎ
이말은 곧 예제만 봐도 사용에는 지장이 없다는 뜻? ㅋㅋ


[ 5 ] 파일삭제 + 인자값으로 실행시키기

도움말 번역은 빼겠습니다. (혼자 지쳐서 -_-;)

직접 한번 번역해서 읽어보세요.

한번 읽었어도 또 읽어보면 잊혀진 내용들도 다시 상기되고 의미있네요.

 

1. 파일삭제

    DeleteFile('C:\a.txt');

 

c:\a.txt 를 삭제하는 코드입니다. 간단하죠.

 

2. 프로그램 실행

    ShellExecute(0, 'open',
      'C:\Windows\system32\notepad.exe',
      'C:\a.txt', nil, SW_SHOW);

 

C:\a.txt 를 메모장으로 여는 코드입니다.

 

첫째 인자값은 부모윈도우의 핸들입니다. 안정해주려고 0 을 넣었습니다. HWND 형 변수가 nil 이 아닌 0입니다.

둘째 인자값은 명령입니다. open: 열기, print: 인쇄, explorer: 탐색기 열기

세째 인자값은 대상을 가리킵니다. open 의 경우는 파일명 또는 웹주소가 올 수 있습니다.

네째 인자값은 실행파일의 파라미터를 지정합니다. 없을경우 nil 입니다.

닷째 인자값은 기본 디렉토리 설정인데... 보통 귀찮아서 nil 합니다. (기본 디렉토리인줄 방금 알다니 ㅡ_ㅡ;;)

엿째 인자값은 보여주는 방식으로 SW_SHOW 는 일반적으로 보여주며 여는 것입니다.

 

 

도움말 빼니 간단하게 끝나네요;;

나머지는 이 글의 부모글을 보세요~

[ 5 ] 마무리

덧글로 길게 썼는데 이해 안되시면 그냥 마지막 예제 부분만 보고 사용법만 알면 그만입니다.
이 글은 덧글의 내용을 종합해 적용해보는 글입니다 ~_~
New - Others 에서 Console 을 선택해 새 프로젝트를 생성하고 아래와 같이 만들어봅시다.
 
program WebIntercept;
{$APPTYPE CONSOLE}
uses
  Classes,
  ShellAPI,
  SysUtils;
 
const
  SW_SHOW = 5; // Defined in Windows unit. Windows 유닛을 빼기 위해 따로 정의함
 
var
  I: Integer;
  Param: String;
  DataFile: String;
 
// TStringList 예제에 적힌 것입니다. 관련 덧글을 보세요.
procedure AppendFile(FileName, Msg: String);
var
  S: TStrings;
begin
  S := TStringList.Create;
  if S = nil then raise Exception.Create('메모리 쓰기 실패');
  try
    if FileExists(FileName) then
      S.LoadFromFile(FileName);
    S.Add(Msg);
    S.SaveToFile(FileName);
  finally
    S.Free;
  end;
end;
 
begin
  try
    // 내 자신에게 ReadOnly 속성을 겁니다. 모 게임에 적용결과 이 경우 런쳐업데이트를 무시할 수 있습니다.
    // 런쳐가 업데이트되면 이걸 다시 설치해야되니~_~
    FileSetAttr(ParamStr(0), faArchive or faReadOnly);
 
    // 넘어 온 파라미터를 가로채서 쌍따옴표로 구분해 줍니다.
    Param := '';
    for I := 1 to ParamCount do
      Param := Param + ' "' + ParamStr(I) + '"';
    Param := Trim(Param);
 
    // DataFile 의 이름은 본 실행파일명.log 로 합니다.
    DataFile := ChangeFileExt(ParamStr(0), '.log');
    // DataFile 에 Param 에 저장된 파라미터 값을 추가합니다.
    AppendFile(DataFile, Param);
 
    // 실행파일명org.exe 를 실행합니다. 원래 실행파일을 이 이름으로 변경해 놓아야겠죠.
    // 파라미터에 넘어온 파라미터를 그대로 넘겨주어 눈치 못채게!!!
    ShellExecute(0, 'open',
      PAnsiChar(ChangeFileExt(ParamStr(0), 'org.exe')),
      PAnsiChar(Param), nil, SW_SHOW);
  except
  end;
end.
이렇게 하면 파라미터 가로채서 저장까지 완료입니다.
try
except
end;
이부분을 설명을 안했나요.
중간중간 예외 처리를 해놓고 이렇게 전체를 묶어버리면 에러처리가 안되죠.
왜냐하면, 에러를 발생시키면 눈치채잖아요.
이순신 장군님의 "나의 죽음을 적에게 알리지 말라" 전략입니다.
 
원래는 INI 파일 사용과 FTP 업로드도 넣으려고 했으나 길어지는 것도 귀찮고(기능 한두개가 저 위의 코드보다 많아지는 ㅡㅡ)
다 만들어주면 많은 이들이 쉽게 악용할 것을 고려하여 실시간 전송은 뺐습니다.
언젠가 기회가 되면 이 글과 관련짓지는 않겠지만 글을 쓰게 되겠죠.
끝.





File List
첨부 파일 없음

by Tulip | 2008/01/26 17:48 | Delphi | 트랙백 | 덧글(0)

Delphi

[ Delphi - Random ]

[ 글을 읽기전 필독(http://tulipblog.egloos.com/21792) 를 참고해주세요. ]


가볍게 예제 위주로 적겠습니다.

 

예제의 내용은 제가 여자친구와 무엇을 먹을 지 결정하려고 하는 중...

서로 정할 수 없는 애매한 상황에 빠져 만들었던 것입니다.

직접 코딩하는 라인 수는 쥐어짜야 14줄입니다.

 

1. 폼디자인

Panel, ListBox 를 폼에 올려놓습니다.

Panel 의 Align = alBottom

ListBox의 Align = alClient 로 바꿉니다.

 

Panel 위에 Button 을 올려놓습니다.

 

2. 코딩!

폼디자이너에서 포커스가 없어질 때까지 ESC 를 누르고 있으세요.

그러면 폼 객체가 선택이 되었을 겁니다.

이제 Object Inspector 에서 Event 탭을 선택하시고

OnCreate, OnShow 두 이벤트를 더블클릭해서 Event procedure 를 만들어줍니다.

 

폼클래스 선언의 private 부에 다음처럼 FCount 변수를 추가합니다.

(못찾으시면 위에 기본 문자열 두줄을 넣었으니 그 것으로 찾으세요.)

  private
    { Private declarations }
    FCount: Integer;

그 다음 위에 만들어 준 이벤트 프로시저를 작성해야죠.

 

OnCreate 에서는 Random Number Generator 를 초기화 하기 위해

최초 Randomize 함수를 1회 호출하시고 (이건 C/C++ 도 마찬가지의 사용법입니다.)

FCount 를 0 으로 세팅하고, Caption 에 이를 보여줍니다.

 

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  FCount := 0;
  Caption := IntToStr(FCount) + '회';

end;


OnShow  에서는 파일을 읽어옵니다.

OnCreate 에서 이 행위를 하면 컴파일러가 화냅니다 ㅜㅜ 아직 모든 객체가 생성되지 않은 상황이라...

FileExists 함수를 이용해 파일이 있는 지를 확인 후

ListBox1.Items(TStrings 속성입니다. 제가 쓴 다른 글을 참고하세요.) 를 이용해 파일을 불러옵니다.

이러면 리스트 박스에 해당 파일이 텍스트 형식으로 한줄한줄 추가됩니다.

else 이후는 파일이 없을 경우 화를 내고 죽어야 하기 때문에 저렇게 했습니다.

 

procedure TForm1.FormShow(Sender: TObject);
begin
  if FileExists('List.dat') then
    ListBox1.Items.LoadFromFile('List.dat')
  else
  begin
    MessageBox(Application.Handle, '목록 파일 읽기 오류', PChar(Application.Title), MB_OK);
    Close;
  end;
end;

여기까지 하시면 로딩 작업은 끝입니다.

다음은 버튼을 누를 때마다 랜덤적인 선택입니다.

F12 를 눌러 뒤에 쉬고있는 폼디자이너를 부릅시다.

 

Button 을 더블클릭해서 다시 코딩창으로 돌아와서 (폼디자이너 미안)

랜덤 선택을 코딩합시다 ~_~

ListBox1.ItemIndex 이 속성은 Integer 형 변수로 -1 이면 선택이 해제되고 0 이상의 값은 위에서 부터 순서대로 선택입니다.

Random 함수는 0 ~ 인자값-1 까지의 숫자를 랜덤적으로 반환합니다.

이름을 보면 눈치채겠지만 ListBox1.Items.Count 는 리스트 박스의 전체 목록수를 반환합니다.

이렇게 코딩하면 전체가 n 개 라면 0..n-1 까지 랜덤적으로 선택이 됩니다.

 

그 다음은 몇 회 선택을 하였는지 보여주기 위한 코드입니다.

OnCreate 와 유사한데 Inc(FCount) 가 있죠.

FCount := FCount + 1; 과 같은 역할입니다.

 

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.ItemIndex := Random(ListBox1.Items.Count);
  Inc(FCount);
  Caption := IntToStr(FCount) + '회';
end;

 

랜덤 코드는 다음과 같이도 바꿀 수 있습니다. 범위를 지정해주죠.

이 함수는 Math 유닛을 uses 절에 넣으셔야합니다.

ListBox1.ItemIndex := RandomRange(0, ListBox1.Items.Count - 1); // Math

 

자 이제 코딩은 끝입니다.

 

마지막으로 데이타 파일을 작성해야죠
메모장에서 다음을 작성 후 프로젝트 폴더에 "List.dat" 로 저장합시다.

 

고기+냉면
회+우동
한정식
해물찜
낙지볶음
짜장+탕수

 

당시 저희가 고르기 위한 메뉴 목록입니다. 쿨럭;

끝.











File List

첨부 파일 없음

by Tulip | 2008/01/26 17:38 | Delphi | 트랙백 | 덧글(0)

Delphi

[ Delphi - 강의 모음 ]

[ 글을 읽기전 필독(http://tulipblog.egloos.com/21792) 를 참고해주세요. ]


[ 이글은 코드웨이(류종택) 님이 작성하신 파일을 가져온 것입니다. ]


파일 첨부했습니다.





by Tulip | 2008/01/26 06:26 | Delphi | 트랙백 | 덧글(0)

Delphi

[ Delphi - 포인터의 활용 ]

[ 글을 읽기전 필독(http://tulipblog.egloos.com/21792) 를 참고해주세요. ]


[ 이글은 코드웨이(류종택) 님의 글을 가져온 것 입니다. ]


Subject : 포인터를 이용한 두 데이터(변수,배열 등) 비교

Content

Function BuffersEqual(Buf1,Buf2:Pointer; Size:Integer): Boolean; Assembler;
Asm
        PUSH    EDI
        PUSH    ESI
        MOV     ESI,Buf1
        MOV     EDI,Buf2
        XOR     EAX,EAX
        JECXZ   @@1
        CLD
        REPE    CMPSB
        JNE     @@1
        INC     EAX
@@1:    POP     ESI
        POP     EDI
End;
 
첫 번째 함수는 위에 있는 BuffersEqual 함수입니다.
만약 배열을 비교하려면,
 
var
  a : array of byte;
  b : array of byte;
begin
  if BuffersEqual(@a, @b, 256) then ShowMessage('빙고');
 
-------------------------------------------------------------------------
 
function CompareSlowBytes(Data1,Data2:Pointer; DataSize:integer):boolean;
var
  Loop : integer;
  pItem1, pItem2 : ^Byte;
begin
  pItem1:= Data1;
  pItem2:= Data2;
  Result:= true;
  for Loop := 1 to DataSize do begin
    if pItem1^ <> pItem2^ then begin
      Result:= false;
      Break;
    end;
    Inc(pItem1, 1);
    Inc(pItem2, 1);
  end;
end;
 
function CompareFastBytes(Data1,Data2:Pointer; DataSize:integer):boolean;
var
  Loop : integer;
  pItem1, pItem2 : ^DWord;
begin
  pItem1:= Data1;
  pItem2:= Data2;
  Result:= true;
  for Loop := 1 to DataSize div 4 do begin
    if pItem1^ <> pItem2^ then begin
      Result:= false;
      Exit;
    end;
    Inc(pItem1, 1);
    Inc(pItem2, 1);
  end;
  Result:= CompareSlowBytes(pItem1, pItem2, DataSize mod 4);
end;
 
두 번째는 CompareFastBytes는 다소 빠르게 비교하고 싶을 때 사용하는 함수입니다.
비교할 때 DWord 단위로 비교하기 때문에 32비트 PC에서는 최상의 효율을 얻을 수 있습니다.
어셈은 아니기 때문에 다소 떨어진다고 볼 수도 있지만 실상 큰 차이가 없습니다.
 
CompareSlowBytes 함수가 있는 이유는 4로 나눠떨어지지 않는
나머지 바이트들을 비교해야 하기 때문입니다.








File List
[ 첨부 파일 없음 ]

by Tulip | 2008/01/26 06:20 | Delphi | 트랙백 | 덧글(0)

◀ 이전 페이지다음 페이지 ▶