Советы по Delphi

         

Преобразование 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 beginhHexStr[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 beginc := BYTE(hexbytes[i]) And BYTE($f);if c > 9 thenInc(c, $37)elseInc(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 begintwoDigits := 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);beginif Len > 255 thenS[0] := Chr(255)elseS[0] := Chr(Len)end;
procedure SetString(var Dst: string; Src: PChar; Len: Integer);beginif Len > 255 thenMove(Src^, Dst[1], 255)elseMove(Src^, Dst[1], Len);SetLength(Dst, Len);end;{$ENDIF}
end.
[000003]



Содержание раздела