[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
{ You've probably seen a lot of code to convert a number to HEX.
Here is one that will take a hex String and covert it back to a number
The conversion is back to type LONGINT, so you can covert to WORDS or
BYTES by simply declaring your whatever varible you want }
{$V-}
USES CRT;
VAR
A : LONGINT;
B : WORD;
C : BYTE;
D : WORD;
{ ---------------------------------------------------------------------- }
FUNCTION HexToLong(S : STRING) : LONGINT;
FUNCTION ANumBin (B : STRING) : LONGINT; Assembler;
ASM
LES DI, B
XOR CH, CH
MOV CL, ES : [DI]
ADD DI, CX
MOV AX, 0
MOV DX, 0
MOV BX, 1
MOV SI, 0
@LOOP :
CMP BYTE PTR ES : [DI], '1'
JNE @NotOne
ADD AX, BX {add power to accum}
ADC DX, SI
@NotOne :
SHL SI, 1 {double power}
SHL BX, 1
ADC SI, 0
DEC DI
LOOP @LOOP
END;
CONST
HexDigits : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
Legal : SET OF Char = ['$','0'..'9','A'..'F'];
BinNibbles : ARRAY [0..15] OF ARRAY [0..3] OF CHAR = (
'0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111');
VAR I : BYTE;
O : STRING;
BEGIN
O := '';
HexToLong := 0; { Returns zero if illegal characters found }
IF S = '' THEN EXIT;
FOR I := 1 TO LENGTH(S) DO
BEGIN
IF NOT (S[i] in LEGAL) THEN EXIT;
O := O + binNibbles[PRED(POS(S[i],Hexdigits))];
END;
HexToLong := ANumBin(O)
END;
{ ---------------------------------------------------------------------- }
BEGIN
ClrScr;
A := HexToLong('$02F8');
B := HexToLong('$0DFF');
C := HexToLong('$00FF'); { The biggest byte there is !! }
D := HexToLong(''); { this is ILLEGAL !! .. D will be ZERO }
WriteLn(A,' ',B,' ',C,' ',D);
END.
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]