Board index » delphi » ASCII to HEX / math

ASCII to HEX / math

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.

 

Re:ASCII to HEX / math


kuh...@atl.mindspring.com (Brian & Amy Kuhnel) writes:

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.

Goodness, so formal!

Just take the ordinal value of each character and pass it to the IntToHex
function. Something like...

var
  Pos, Lth : Integer;
  SrcString, HexString : string;
begin
  { Whatever it takes to build SrcString }
  Lth := Length(SrcString);
  HexString := '';
  for Pos := 1 to Lth do
    HexString := HexString + IntToHex(Ord(SrcString[Pos]), 2);
  { HexString now contains the expanded hex of SrcString (I hope) }
  ...
  ...
end;

--
Luke Webber

* Note: The opinions expressed by Luke Webber are in no way supported *
*       by his employers, Luke Webber Consulting Services             *

Re:ASCII to HEX / math


Brian & Amy Kuhnel wrote:

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.

Yes : Use IntToHex on the decimal ascii value.

Re:ASCII to HEX / math


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.

Re:ASCII to HEX / math


Thanks to all who responded.  I ended up using the Ord function in
conjunction with the IntToHex function.  I did all of the arithmetic
in integer values, then converted the result.

Other Threads