A

Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Преобразование ASCII в шестнадцатеричное представление


Строка представляет собой массив байтов в виде ASCII-символов. Необходимо организовать преобразование типов по аналогии с Delphi-функциями Ord и Chr.

Функция 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 .

 

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz