delphi 进制转换

时间:2022-02-16 06:17:57

----二进制到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.