In article <4utt12$1...@mule1.mindspring.com>, kuh...@atl.mindspring.com
says...
Quote
>I have run across a situation where I receive a string of ASCII
>characters, must convert these to their hex values(ie "0" becomes
>"30"), and perform additions and subtractions on the values. Is there
>any functions or tools in Delphi or Windows that permit such
>operations? Thanks in advance for any assistance which is provided.
These work on byte array to strings, also look at the Ord and Chr functions in
Delphi.
BytesToHexStr does this [0,1,1,0] of byte would be converted to
string := '30313130';
HexStrToBytes goes the other way.
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 must point to enough memory to hold the output}
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.
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.