# STRTOHEX

Yo guys im stuck here

I need to convert a text to hex - not a big deal if you use inttohex(strtoint(text),2);

Now the problem:

how do I convert a text like :

my_text := 1234567890123;
showmessage(inttohex(strtoint(my_text),2)); // this will raise an exception in strtoint(my_text) since the number is higher then 2147483647

Question: Is there a way to convert a string with up to 10 digits into hexadecimal ? how to do it ?

thx in adv
LVL 7
Asked:
###### Who is Participating?

Senior DeveloperCommented:
I think I've got this right :-)
try it out

procedure TForm1.Button1Click(Sender: TObject);
var
my_text: string;
begin
my_text := '1234567890123';
showmessage(Int64ToHex(StrToInt64(my_text)));
end;

procedure Int64ToHex(bigi: int64): string;
var
lo1: integer;
begin
result := '';
while bigi > 0 do
begin
lo1 := lo(bigi);
result := IntToHex(lo1, 2) + result;
bigi := bigi shr 8;
end;
result := '\$' + result;
end;
0

Senior DeveloperCommented:
what i'm doing is using an int64 (because it can store larger numbers) and then working out the hex for 1 byte at a time
"lo( )" gets the bottom byte, and "shr 8" moves my "big number" to the right 1 byte (8 bits), effectively dropping off the last byte I just grabbed
I append the hex values, and stick a \$ at the start
0

Commented:
here is an alternative I've just spent some time on implementing that takes an integer string as uinput no matter how many digits:

procedure bigdiv16(int:string; var d,m:string);
var n,i,k:integer;
begin
i:=1;
repeat
n:=strtoint(copy(int,1,i));
inc(i);
until (n div 16>0) or (i>length(int));
if i>length(int) then
begin
d:='0';
m:=int;//=inttostr(n);
exit;
end;
d:='';
k:=1;
repeat
n:=strtoint(copy(int,1,i-1+k-1));
if n div 16 > 9 then
begin
dec(i);
continue;
end;
d:=d+chr((n div 16)+48);
if (n<16) and (length(int)>i-1+k-1) then
begin
inc(i);
continue;
end;
delete(int,1,i-1+k-1);
int:=inttostr(n mod 16)+int;
k:=length(inttostr(n mod 16));
until length(int)=k;
m:=int;
end;

function strtohex(int:string):string;
var d,m:string;
begin
d:=int;
result:='';
repeat
bigdiv16(d,d,m);
result:=inttohex(strtoint(m),1)+result;
until d='0';
end;

my initial algorithm was much simpler, but there were some bugs. and that is why I put in thos nasty inc/decs. it's 4:30 am here. I should go to sleep cause I make ugly code :D

peace
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

## Already a member? Login.

All Courses

From novice to tech pro — start learning today.