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

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


Category

  김영대(2004-12-08 12:58:31, Hit : 4885, Vote : 1215
 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.





  [알고리즘] 임의의 밑수(radix)를 사용한 진법변환  김영대 2004/12/08 4885 1215
490   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4886 1327
489   [일반/컴포넌트] Outlook Express 설치여부 알아내기  김영대 2003/03/07 4886 1128
488   [시스템] 설치된 modem 리스트 구하기  김영대 2003/03/07 4887 1416
487   [일반/컴포넌트] ListBox.Items.Add 는 느리고 깜박거린다(?)  김영대 2003/03/05 4888 1139
486   [윈도우즈 API] 탐색기와 같은 BrowseFolder 열기  김영대 2003/03/05 4888 1317
485   [윈도우즈 API] 메모(TMemo)의 커서(캐럿)모양 바꾸기  김영대 2003/03/05 4888 1913
484   [COM/OLE] Registering *.tlb files without Delphi  김영대 2003/03/06 4891 1127
483   [네트웍/인터넷] 네트워크 컴퓨터가 존재하는지 검사하기  김영대 2003/03/07 4892 1261
482   [윈도우즈 API] 휴지통이 비어있는지 확인하기  김영대 2004/08/05 4896 1242
481   [윈도우즈 API] 다른 프로그램의 구동 디렉토리 알아내기  김영대 2003/03/07 4898 1336
480   [일반/컴포넌트] 문자열 역으로 만들기(reverse a string)  김영대 2003/03/06 4899 1486
479   [일반/컴포넌트] ListBox의 내용을 클립보드로 복사하기  김영대 2003/03/05 4903 1134
478   [일반/컴포넌트] TRichEdit 콤포넌트 없이 RTF파일 인쇄하기  김영대 2003/03/05 4903 1420
477   [네트웍/인터넷] 인터넷에 LAN 또는 Modem으로 접속중인지 검사  김영대 2003/03/07 4905 1300
476   [일반/컴포넌트] 프린터로 escape 문자 출력하기(raw print)  김영대 2003/03/07 4907 1231
475   [네트웍/인터넷] IP로 이름 구하기 또는 이름으로 IP 구하기  김영대 2003/03/30 4908 1286
474   [일반/컴포넌트] Convert between a DFM and a TXT file  김영대 2003/03/05 4909 1428
473   [데이터베이스] DBGrid 에서 선택된 필드의 타이틀을 굵게  김영대 2003/03/04 4911 1356
472   [시스템] CD-ROM 문 열기/닫기  김영대 2003/03/04 4914 1413
471   [알고리즘] 32bit CRC (cyclic redundancy check)  김영대 2004/09/17 4918 1233
470   [일반/컴포넌트] Bitmap(BMP) 크기를 변경(Stretch)하여 저장하기  김영대 2003/03/07 4919 1299
469   [시스템] 프로그램 제거(Uninstall) 목록 구하기  김영대 2004/08/05 4922 1308
468   [일반/컴포넌트] 동적으로 프로젝트의 Main form 바꾸기  김영대 2003/04/11 4923 1188
467   [일반/컴포넌트] StrToFloatDef  김영대 2003/11/13 4927 1258
466   [시스템] CPU의 사용률 구하기  김영대 2003/03/07 4929 1275
465   [일반/컴포넌트] Memo의 커서를 특정 위치로 보낸후 scroll 시키기  김영대 2003/03/05 4933 1158
464   [시스템] 마우스 포인터 속도 바꾸기  김영대 2003/03/06 4933 1250
463   [일반/컴포넌트] ListView 의 column header 오른쪽에 이미지 넣기  김영대 2003/03/07 4937 1209
462   [일반/컴포넌트] PageControl 에서 미리 이동하려는 Sheet 알아내어 제어하기  김영대 2004/09/13 4937 1260
461   [일반/컴포넌트] ASCII printing  김영대 2003/03/06 4939 1196
460   [일반/컴포넌트] MIME 타입에 해당하는 파일 확장자 구하기  김영대 2004/11/18 4941 1326
459   [네트웍/인터넷] Read/Write to COM Port  김영대 2003/03/07 4943 1173
458   [일반/컴포넌트] Multi-Line Hints  김영대 2003/03/05 4948 1487
457   [윈도우즈 API] '알려진 파일 형식의 파일 확장명 숨김' 여부  김영대 2004/08/25 4954 1250
456   [일반/컴포넌트] URL 을 각 part로 분리하기  김영대 2003/03/30 4955 1272
455   [윈도우즈 API] IE 임시 인터넷 파일 폴더 비우기2  김영대 2004/08/11 4958 1299
454   [COM/OLE] How to register an OCX  김영대 2003/03/06 4959 1169
453   [일반/컴포넌트] 파일의 변경/생성/사용한 날짜 바꾸기  김영대 2003/03/07 4959 1260
452   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4962 1347

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

Copyright 1999-2021 Zeroboard / skin by zero