Выбрать главу

 for i:= 0 to (InputLength – 1) do begin

  c:= BYTE(HexBytes[i]) And BYTE($f);

  if c > 9 then Inc(c, $37)

  else Inc(c, $30);

  Response[i + 1]:= char(c);

 end;{for}

end;

procedure HexStrToBytes(hHexStr: String; pbyteArray: Pointer);

{pbyteArray указывает на область памяти, хранящей результаты}

var

 i, j: WORD;

 tempPtr: PChar;

 twoDigits: String[2];

begin

 tempPtr:= pbyteArray;

 j:= 1;

 for i:= 1 to (Length(hHexStr) DIV 2) do begin

  twoDigits:= Copy(hHexStr, j, 2); Inc(j, 2);

  PByte(tempPtr)^:= StrToInt('$' + twoDigits); Inc(tempPtr);

 end;{for}

end;

end.

UNIT string16.

interface

{$IFNDEF Win32}

procedure SetLength(var S: string; Len: Integer);

procedure SetString(var Dst: string; Src: PChar; Len: Integer);

{$ENDIF}

implementation

{$IFNDEF Win32}

procedure SetLength(var S: string; Len: Integer);

begin

 if len > 255 then S[0]:= Chr(255)

 else S[0]:= Chr(Len)

end;

procedure SetString(var Dst: string; Src: PChar; Len: Integer);

begin

 if Len > 255 then Move(Src^, Dst[1], 255)

 else Move(Src^, Dst[1], Len);

 SetLength(Dst, Len);

end;

{$ENDIF}

end.

Преобразование двоичного числа в десятичное

Может ли кто-нибудь дать мне идею простого преобразования двоичного кода (base2) в десятичный (base10)?

Решение 1

/////////////////////////////////////////////////////////////////////////

// преобразование 32-битного base2 в 32-битный base10                  //

// максимальное число = 99 999 999, возвращает –1 при большем значении //

/////////////////////////////////////////////////////////////////////////

function base10(base2:integer) : integer; assembler;

asm

 cmp        eax,100000000        // проверка максимального значения

 jb         @1                   // значение в пределах допустимого

 mov        eax,-1               // флаг ошибки

 jmp        @exit                // выход если –1

@1:

 push       ebx                  // сохранение регистров

 push       esi

 xor        esi,esi              // результат = 0

 mov        ebx,10               // вычисление десятичного логарифма

 mov        ecx,8                // преобразование по формуле 10^8-1

@2:

 mov        edx,0                // удаление разницы

 div        ebx                  // eax – целочисленное деление на 10, edx – остаток от деления на 10

 add        esi,edx              // результат = результат + разность[I]

 ror        esi,4                // перемещение разряда

 loop       @2                   // цикл для всех 8 разрядов

 mov        eax,esi              // результат функции

 pop        esi                  // восстанавление регистров

 pop        ebx

@exit:

end;

Решение 2

function IntToBin(Value: Longint; Size: Integer): String;

var

 i: Integer;

begin

 Result :='';

 for i:= Size 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 BinToInt(Value: String): Longint;

var

 i,Size: Integer;

begin

 Result:= 0;

 Size:= Length(Value);

 for i:=Size downto 0 do begin

  if copy(value,i,1) = '1' then begin

   Result:= Result + (1 shl i);

  end;

 end;

end;

Решение 3

Следующая функция получает в качестве параметра Base (1..16) любую десятичную величину и возвращает результат в виде строки, содержащей точное значение BaseX. Вы можете использовать данный алгоритм для преобразования арабских чисел в римские (смотри ниже).

function DecToBase(Decimaclass="underline" Longint; const Base: Byte): String;

const Symbols: String[16] = '0123456789ABCDEF';

var

 scratch: String;

 remainder: Byte;

begin

 scratch:= '';

 repeat

  remainder:= Decimal mod base;

  scratch:= Symbols[remainder + 1] + scratch;

  Decimaclass="underline" = Decimal div base;

 until (decimal = 0);

 Result:= scratch;

end;

Передайте данной функции любую десятичную величину (1…3999), и она возвратит строку, содержащую точное значение в римской транскрипции.

function DecToRoman(Decimaclass="underline" Longint ): String;

const Romans: Array[1..13] of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');

 Arabics: Array[1..13] of integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);

var

 i: Integer;

 scratch: String;

begin

 scratch:= '';

 for i := 13 downto 1 do

  while (decimal >= arabics[i]) do begin

   Decimaclass="underline" = Decimal – Arabics[i];

   scratch:= scratch + Romans[i];

  end;

 Result:= scratch;

end;

Преобразование ICO в BMP

Решение 1

Попробуйте:

var

 Icon: TIcon;

 Bitmap: TBitmap;

begin

 Icon:= TIcon.Create;

 Bitmap:= TBitmap.Create;

 Icon.LoadFromFile('c:\picture.ico');

 Bitmap.Width:= Icon.Width;

 Bitmap.Height:= Icon.Height;