1. 程式人生 > >delphi 進制轉換

delphi 進制轉換

進制


----二進制到16進制

function BinaryToHex(strBinary: string): string;
var
vD: Byte;
i: integer;
vHextStr: String;
vP: PChar;
vLen: integer;
begin
vLen := length(strBinary);
if vLen mod 4 > 0 then
begin
SetLength(vHextStr, vLen div 4 + 1);
vLen := vLen div 4 + 1;
end
else
begin
SetLength(vHextStr, vLen div 4);

vLen := vLen div 4;
end;

// 初始化
vD := 0;
vP := PChar(strBinary) + length(strBinary) - 1;
i := 0; // 開始計數

while vP^ <> #0 do
begin
if vP^ = ‘1‘ then
begin
case i of
0:
vD := vD + 1;
1:
vD := vD + 2;
2:
vD := vD + 4;
3:
vD := vD + 8;
end;
end;

Dec(vP);
Inc(i);
if i = 4 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
10 .. 15:
vHextStr[vLen] := Chr(vD - 10 + $41);
end;
Dec(vLen);
i := 0;
vD := 0;
end;
end;

if i > 0 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
10 .. 15:
vHextStr[vLen] := Chr(vD + $41);
end;
end;

Result := vHextStr;
end;


---16進制到二進制

function HextoBinary(hex: string): string;

const

BOX: array [0 .. 15] of string =

(‘0000‘, ‘0001‘, ‘0010‘, ‘0011‘,

‘0100‘, ‘0101‘, ‘0110‘, ‘0111‘,

‘1000‘, ‘1001‘, ‘1010‘, ‘1011‘,

‘1100‘, ‘1101‘, ‘1110‘, ‘1111‘);

var

i: integer;

begin

for i := length(hex) downto 1 do

Result := BOX[StrToInt(‘$‘ + hex[i])] + Result;

end;


-----十六進制到10進制

function HexToInt2(hex: AnsiString): integer;
var
i: integer;
function Ncf(num, f: integer): integer;
var
i: integer;
begin
Result := 1;
if f = 0 then
exit;
for i := 1 to f do
Result := Result * num;
end;
function HexCharToInt(HexToken: Ansichar): integer;
begin
if Ord(HexToken) > 97 then
HexToken := Ansichar(Chr(Ord(HexToken) - 32));
Result := 0;
if (Ord(HexToken) > 47) and (Ord(HexToken) < 58) then { chars 0....9 }
Result := Ord(HexToken) - 48
else if (Ord(HexToken) > 64) and (Ord(HexToken) < 71) then { chars A....F }
Result := Ord(HexToken) - 55;
end;

var
a16int: integer;
ancf: integer;
begin
Result := 0;
hex := ansiuppercase(trim(hex));
if hex = ‘‘ then
exit;
for i := 1 to length(hex) do
// result := result + HexCharToInt(hex[i]) * ncf(16, length(hex) - i);
begin
a16int := HexCharToInt(hex[i]);
ancf := Ncf(16, length(hex) - i);
Result := Result + a16int * ancf;
end;
end;

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

delphi中有直接把10進制轉換成16進制的函數 :

function IntToHex(Value: Integer; Digits: Integer): string;
overload;

function IntToHex(Value: Int64; Digits: Integer): string; overload;

unit uConversion;

interface

uses
SysUtils, Math;

type
TConversion = class
public
// 10 進制 to 2,8,16 進制
function inttoBitStr(intstr: string): string;
function IntToHexStr(intstr: string): String; // 10 = 2
function IntToOStr(intstr: string): string;

// 2進制 to 10,8,16 進制
function BittoInt(BitStr: String): LongInt; // 2 = 10
function BitStrToHextStr(const BitStr: String): String; // 2 = 16
function BitStrToOStr(const BitStr: String): String; // 2 = 8

// 16 > 10 2 8 進制
function HextoIntStr(HexStr: String): string;
function HexToBitStr(HexStr: string): string;
function HexToOStr(HexStr: string): string;

// 八進制轉換成二進制字符串
function OtoBitStr(O: string): string;
function OtoIntStr(O: string): string;
function OtoHexStr(O: string): string;
end;

var
TC: TConversion;

implementation

{ TConversion }
// 2 進制 to 10 進制

function TConversion.BittoInt(BitStr: String): LongInt;
var
i, Size: Integer;
begin
Result := 0;
Size := Length(BitStr);
for i := Size downto 1 do
begin
// 例如 1010
if Copy(BitStr, i, 1) = ‘1‘ then
Result := Result + (1 shl (Size - i));
end;
// 第二種方法
// 二進制轉換為十進制 start
{
VAR
str : String;
Int : Integer;
i : integer;

Str := UpperCase(Edit1.Text);
Int := 0;
FOR i := 1 TO Length(str) DO
Int := Int * 2 + ORD(str[i]) - 48;
Edit2.Text:=IntToStr(int);
}
// 二進制轉換為十進制 end;
// 第三中方法
{
function hextoint(s: string): Double;
begin
while Length(s) <>0 do
begin //2^(長度-1)次方
if s[1]=‘1‘ then Result:=Result+power(2,Length(s)-1);
s:=Copy(s,2,Length(s));
end
end;
}
end;

function TConversion.BitStrToHextStr(const BitStr: String): String;
var
vD: Byte;
i: Integer;
vHextStr: String;
vP: PChar;
vLen: Integer;
begin
vLen := Length(BitStr);
if vLen mod 4 > 0 then
begin
SetLength(vHextStr, vLen div 4 + 1);
vLen := vLen div 4 + 1;
end
else
begin
SetLength(vHextStr, vLen div 4);
vLen := vLen div 4;
end;

// 初始化
vD := 0;
vP := PChar(BitStr) + Length(BitStr) - 1;
i := 0; // 開始計數

while vP^ <> #0 do
begin
if vP^ = ‘1‘ then
begin
case i of
0:
vD := vD + 1;
1:
vD := vD + 2;
2:
vD := vD + 4;
3:
vD := vD + 8;
end;
end;

Dec(vP);
Inc(i);
if i = 4 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
10 .. 15:
vHextStr[vLen] := Chr(vD - 10 + $41);
end;
Dec(vLen);
i := 0;
vD := 0;
end;
end;

if i > 0 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
10 .. 15:
vHextStr[vLen] := Chr(vD + $41);
end;
end;

Result := vHextStr;
end;

function TConversion.BitStrToOStr(const BitStr: String): String;
var
vD: Byte;
i: Integer;
vHextStr: String;
vP: PChar;
vLen: Integer;
begin
vLen := Length(BitStr);
if vLen mod 3 > 0 then
begin
SetLength(vHextStr, vLen div 3 + 1);
vLen := vLen div 3 + 1;
end
else
begin
SetLength(vHextStr, vLen div 3);
vLen := vLen div 3;
end;

// 初始化
vD := 0;
vP := PChar(BitStr) + Length(BitStr) - 1;
i := 0; // 開始計數

while vP^ <> #0 do
begin
if vP^ = ‘1‘ then
begin
case i of
0:
vD := vD + 1;
1:
vD := vD + 2;
2:
vD := vD + 4;
end;
end;

Dec(vP);
Inc(i);
if i = 3 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
end;
Dec(vLen);
i := 0;
vD := 0;
end;
end;

if i > 0 then
begin
case vD of
0 .. 9:
vHextStr[vLen] := Chr(vD + $30);
end;
end;

Result := vHextStr;
end;

function TConversion.HexToBitStr(HexStr: string): string;
const
cBitStrings: array [0 .. 15] of string = (‘0000‘, ‘0001‘, ‘0010‘, ‘0011‘,
‘0100‘, ‘0101‘, ‘0110‘, ‘0111‘, ‘1000‘, ‘1001‘, ‘1010‘, ‘1011‘, ‘1100‘,
‘1101‘, ‘1110‘, ‘1111‘);
var
i: Integer;
begin
Result := ‘‘;
for i := 1 to Length(HexStr) do
Result := Result + cBitStrings[StrToIntDef(‘$‘ + HexStr[i], 0)];
while Pos(‘0‘, Result) = 1 do
Delete(Result, 1, 1);
end; { HexToBit }

function TConversion.HextoIntStr(HexStr: String): string;
begin
Result := IntToStr(StrToInt(‘$‘ + (HexStr)));
end;

function TConversion.HexToOStr(HexStr: string): string;
begin
Result := BitStrToOStr(HexToBitStr(HexStr));
end;

function TConversion.inttoBitStr(intstr: string): string;
var
i: Integer;
begin
i := StrToInt(intstr);
while i <> 0 do
begin // i mod 2取模,再使用format格式化
Result := Format(‘%d‘ + Result, [i mod 2]);
i := i div 2
end
end;
// 10進制裝換 2進制 第二種方法
{ function TConversion.IntToBitStr(Value, Size: Integer): String;
var
i: Integer;
begin
Result:=‘‘;
for i:=Size-1 downto 0 do begin
if Value and (1 shl i)<>0 then begin
Result:=Result+‘1‘;
end else begin
Result:=Result+‘0‘;
end;
end;
end; }

function TConversion.IntToHexStr(intstr: string): String;
begin
Result := inttoBitStr(intstr);
end;

function TConversion.IntToOStr(intstr: string): string;
begin
Result := BitStrToHextStr(inttoBitStr(intstr));
end;

function TConversion.OtoBitStr(O: string): string;
const
cBitStrings: array [0 .. 7] of string = (‘000‘, ‘001‘, ‘010‘, ‘011‘, ‘100‘,
‘101‘, ‘110‘, ‘111‘);
var
i, j: Integer;
begin
Result := ‘‘;
for i := 1 to Length(O) do
begin
j := StrToInt(O[i]);
Result := Result + cBitStrings[j];
end;
while Pos(‘0‘, Result) = 1 do
Delete(Result, 1, 1);
end;

function TConversion.OtoHexStr(O: string): string;
begin
Result := BitStrToHextStr(OtoBitStr(O));
end;

function TConversion.OtoIntStr(O: string): string;
begin
Result := OtoIntStr(OtoBitStr(O));
end;

end.

本文出自 “一切有為法,如夢幻泡影” 博客,請務必保留此出處http://kaixinbuliao.blog.51cto.com/2567365/1937471

delphi 進制轉換