::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-12-08 12:58:31, Hit : 4889, Vote : 1216
 http://www.howto.pe.kr
 임의의 밑수(radix)를 사용한 진법변환

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{
Delphi FAQ article #16470:

The RadixStr() function takes a pointer to a null terminated string
containing a number of one base, and fills a buffer with a null
terminated string containing the number converted to another base.

Parameters:

NumStr: A pointer to a null terminated string containing the numeric
string to convert:

Radix: The base of the number contained in the NumStr parameter. The
base must be in the range of 2 to 36;

ResultStr : A pointer to a null terminated string buffer to place the
resulting numeric string. The buffer should be sufficiently large to
hold the resulting string.

NewRadix: The base to use in the conversion. The base must be in the
range of 2 to 36;

ErrorCode: Upon return, contains  the return code 0 if successful, or
the character number of the offending character contained in the
buffer NumStr.
}
procedure RadixStr(NumStr: pChar;
                   Radix: LongInt;
                   ResultStr: pChar;
                   NewRadix: LongInt;
                   var ErrorCode: LongInt);
var
  RadixChar: array[0..35] of Char;
  v: LongInt;
  i: LongInt;
  p: LongInt;
  c: Integer;
begin
  if ((Abs(Radix) < 2) or
      (Abs(Radix) > 36)) then
  begin
    ErrorCode := p;
    Exit;
  end;
  StrLCopy(ResultStr, NumStr, StrLen(NumStr));
  for i := 0 to 35 do
  begin
    if i <= 9 then
      RadixChar[i] := Char(48 + (i))
    else
      RadixChar[i] := Char(64 + (i - 9))
  end;
  v := 0;
  for i := 0 to (StrLen(ResultStr) - 1) do
  begin
    ResultStr[i] := UpCase(ResultStr[i]);
    p := Pos(ResultStr[i], PChar(@RadixChar)) - 1;
    if ((p < 0) or
        (p >= Abs(Radix))) then
    begin
      ErrorCode := i;
      Exit;
    end;
    v := v * Abs(Radix) + p;
  end;
  if v = 0 then
  begin
    ResultStr := '0';
    ErrorCode := 0;
    exit;
  end
  else
  begin
    i:=0;
    repeat
      ResultStr[i] := RadixChar[v mod NewRadix];
      v := v div NewRadix;
      Inc(i)
    until v = 0;
    if Radix < 0 then
    begin
      ResultStr[i] := '-';
      ResultStr[i + 1] := #0
    end
    else
      ResultStr[i] := #0;
    p := StrLen(ResultStr);
    for i := 0 to ((p div 2) - 1) do
    begin
      ResultStr[i] := Char(Byte(ResultStr[i]) xor
                           Byte(ResultStr[(p - i) - 1]));
      ResultStr[(p - i) - 1] := Char(Byte(ResultStr[(p - i) - 1]) xor
                                     Byte(ResultStr[i]));
      ResultStr[i] := Char(Byte(ResultStr[i]) xor
                           Byte(ResultStr[(p - i) - 1]))
    end;
    ResultStr[p] := #0;
    ErrorCode := 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer: array[0..35] of Char;
  ErrorCode: LongInt;
begin
  // Convert Hex to Decimal
  // 16진수 FF를 10진수로 변환
  RadixStr('FF',
           16,
           @Buffer,
           10,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(16):FF->(10):'+StrPas(Buffer));

  // Convert Decimal to Hex
  // 10진수 255를 16진수로 변환
  RadixStr('255',
           10,
           @Buffer,
           16,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(10):255->(16):'+StrPas(Buffer));        

  // Convert Decimal to Binary
  // 10진수 255를 2진수로 변환
  RadixStr('255',
           10,
           @Buffer,
           2,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(10):255->(2):'+StrPas(Buffer));        

  // Convert Binary to Decimal
  // 2진수 11111111를 10진수로 변환
  RadixStr('11111111',
           2,
           @Buffer,
           10,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(2):11111111->(10):'+StrPas(Buffer));

  // Convert Hex to Octal
  // 16진수 FF를 8진수로 변환
  RadixStr('FF',
           16,
           @Buffer,
           8,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(16):FF->(8):'+StrPas(Buffer));

  // Convert Octal to Hex
  // 8진수 377를 16진수로 변환
  RadixStr('377',
           8,
           @Buffer,
           16,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(8):377->(16):'+StrPas(Buffer));

  // Convert Binary to Octal
  // 2진수 11111111를 8진수로 변환
  RadixStr('11111111',
           2,
           @Buffer,
           8,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(2):11111111->(8):'+StrPas(Buffer));

  // Convert Octal to Binary
  // 8진수 377를 2진수로 변환
  RadixStr('377',
           8,
           @Buffer,
           2,
           ErrorCode);
  if ErrorCode = 0 then
    ShowMessage('(8):377->(2):'+StrPas(Buffer));
    
end;

end.





411   [COM/OLE] 내 프로그램에서 선택한 text를 다른 프로그램에 Drag&Drop으로 주기  김영대 2004/12/10 5805 1225
410   [COM/OLE] TWebBrowser에서 JavaScript 호출하기  김영대 2004/10/09 5565 1225
409   [일반/컴포넌트] Task bar 에 나타나는 프로그램 아이콘 바꾸기  김영대 2004/08/11 5067 1225
408   [데이터베이스] DB에서 자음(ㄱ,ㄴ,ㄷ....)으로 SELECT 하기  김영대 2003/03/12 5168 1225
407   [일반/컴포넌트] 한글이 포함된 문자열 자르기 - 반쪽 한글  김영대 2003/03/04 6355 1225
406   [윈도우즈 API] 실행중인 모든 프로그램 Minimized 시키기  김영대 2003/03/06 4607 1224
405   [윈도우즈 API] 원도우 이동시 다시 그리기 설정/해제  김영대 2003/03/07 4500 1223
404   [데이터베이스] 테이블,인덱스 복사하기  김영대 2003/03/07 4078 1223
403   [시스템] 윈도우즈 서비스 목록 구하기  김영대 2004/07/22 4521 1222
402   [네트웍/인터넷] Winsock WriteFile and Overlapped IO  김영대 2003/11/18 5385 1222
401   [시스템] 윈도우즈 전체의 키보드 입력 금지  김영대 2003/03/07 4558 1222
400   [멀티미디어] JPEG, WAVE 를 resource 파일에 넣고 읽어오기  김영대 2003/03/06 5138 1222
399   [윈도우즈 API] 정의되지 않은 Alt+키 입력시 Beep음 제거  김영대 2003/03/07 4336 1221
398   [윈도우즈 API] 작업관리자의 task switching 금지시키기  김영대 2003/03/07 4638 1221
397   [일반/컴포넌트] TForm을 BMP파일로 저장하기  김영대 2003/03/05 4810 1221
396   [일반/컴포넌트] 한 장당 두 페이지 인쇄하기  김영대 2003/03/05 4760 1221
395   [윈도우즈 API] 떠다니는 윈도우  김영대 2003/03/05 4540 1220
394   [일반/컴포넌트] LZExpand를 사용한 파일 복사하기  김영대 2003/03/04 4045 1220
393   [시스템] DOS-matrix 프린터에 인쇄하기  김영대 2003/03/07 4520 1219
392   [시스템] Locking/ Unlocking floppy driver or CD  김영대 2003/03/07 4268 1218
391   [시스템] 현재 내 PC의 비디오 정보  김영대 2003/03/04 4565 1218
390   [일반/컴포넌트] Image의 90도 회전  김영대 2003/03/04 5430 1218
389   [시스템] 윈도우즈 캡션의 높이 읽기/설정  김영대 2003/03/07 4437 1217
  [알고리즘] 임의의 밑수(radix)를 사용한 진법변환  김영대 2004/12/08 4889 1216
387   [일반/컴포넌트] 문자열 프로시저명으로 실제 프로시저 호출하기2  김영대 2004/10/08 4767 1216
386   [윈도우즈 API] Active Desktop 활성화 여부  김영대 2004/08/25 4638 1216
385   [일반/컴포넌트] IE Toolbar 에 버튼 올리기  김영대 2003/03/26 4752 1215
384   [윈도우즈 API] 휴지통에 파일을 버리는 법  신훈재 2003/03/10 4578 1215
383   [윈도우즈 API] Window Handle 로 실행파일명 구하기  김영대 2003/03/07 4701 1215
382   [윈도우즈 API] Taskbar 감추기/보이기  김영대 2003/03/05 4656 1215
381   [일반/컴포넌트] 주어진 문자열에 잘못된 숫자값이 들어있는지 검사  김영대 2003/03/04 4182 1215
380   [일반/컴포넌트] ListView 의 item 을 강제로 편집상태로 만들기  김영대 2003/03/07 4604 1213
379   [일반/컴포넌트] ListBox의 내용을 파일로 저장하고 불러오기  김영대 2003/03/04 4334 1213
378   [시스템] 윈도우즈 부팅 모드(정상, 안전)  김영대 2004/08/05 4250 1212
377   [일반/컴포넌트] Windows의 사용자이름, 작업그룹 구하기  김영대 2003/04/01 4854 1212
376   [일반/컴포넌트] Form이 생성되어 있는지 검사하기  김영대 2003/03/05 4113 1212
375   [윈도우즈 API] 윈도우즈 "시작" 메뉴 표시하기/감추기  김영대 2003/03/07 4532 1211
374   [시스템] 기본 프린터가 있어야 실행하지 ?  김영대 2003/03/05 4568 1211
373   [일반/컴포넌트] TEdit의 OnChange에서 Text 바꾸기  김영대 2003/03/04 4171 1211
372   [일반/컴포넌트] StringGrid의 Column의 크기(width) 자동 조절  김영대 2003/03/04 6629 1211

[이전 10개] [1]..[11][12][13][14] 15 [16][17][18][19][20]..[25] [다음 10개]
 

Copyright 1999-2021 Zeroboard / skin by zero