Советы по Delphi. Версия 1.0.6 - страница 3

стр.

Функция BytesToHexStr преобразует, к примеру, набор байтов [0,1,1,0] в строку '30313130', HexStrToBytes выполнит обратное преобразование.

>unit Hexstr;


>interface

>uses String16, SysUtils;


>Type

> PByte = ^BYTE;


>procedure BytesToHexstr(var hHexStr: String; pbyteArray: PByte; InputLength: WORD);

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

>procedure HexBytesToChar(var Response: String; hexbytes: PChar; InputLength: WORD);


>implementation

>procedure BytesToHexStr(var hHexStr: String; pbyteArray: PByte; InputLength: WORD);

>Const

> HexChars : Array[0..15] of char = '0123456789ABCDEF';

>var

> i, j: WORD;

>begin

> SetLength(hHexStr, (InputLength * 2));

> FillChar(hHexStr, sizeof(hHexStr), #0);

> j:= 1;

> for i := 1 to InputLength  do begin

>  hHexStr[j]:= Char(HexChars[pbyteArray^ shr  4]); inc(j);

>  hHexStr[j]:= Char(HexChars[pbyteArray^ and 15]); inc(j);

>  inc(pbyteArray);

> end;

>end;


>procedure HexBytesToChar(var Response: String; hexbytes: PChar; InputLength: WORD);

>var

> i: WORD;

> c: byte;

>begin

> SetLength(Response, InputLength);

> FillChar(Response, SizeOf(Response), #0);

> 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;