Since long time, on french forum, we created this 2 functions :
- HexVal : to convert hex value string in decimal value
- BinVal : to convert binary value string in decimal value
it's complementary with Hex() and Bin() function
It's really useful, why don't add this in PB
The code, it's optimized to obtain the fastest function as possible.
Code: Select all
ProcedureDLL.l HexVal(Hex.s) ; Convertir une chaine hexadécimal en valeur numérique
Protected Val.l
MOV Ecx, Hex
LEA Ebx, [TableValeurHex]
MOV Edx, 0
MOV Eax, 0
! EncoreChaineHex :
MOV al, byte[Ecx]
CMP al, 0
JE FinChaineHex
XLATB
CMP Eax, $FF
JE ErreurChaineHex
ROL Edx, 4
ADD Edx, Eax
INC Ecx
JMP EncoreChaineHex
! FinChaineHex :
MOV Val, Edx
ProcedureReturn Val
! ErreurChaineHex :
ProcedureReturn - 1
! TableValeurHex :
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $0A, $0B, $0C, $0D, $0E, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $0A, $0B, $0C, $0D, $0E, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
EndProcedure
ProcedureDLL.l BinVal(Bin.s) ; Convertir une chaine binaire en valeur numérique
Protected Val.l
MOV Ecx, Bin
LEA Ebx, [TableValeurBin]
MOV Edx, 0
MOV Eax, 0
! EncoreChaineBin :
MOV al, byte[Ecx]
CMP al, 0
JE FinChaineBin
XLATB
CMP Eax, $FF
JE ErreurChaineBin
ROL Edx, 1
ADD Edx, Eax
INC Ecx
JMP EncoreChaineBin
! FinChaineBin :
MOV Val, Edx
ProcedureReturn Val
! ErreurChaineBin :
ProcedureReturn - 1
! TableValeurBin :
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $00, $01, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
! DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
EndProcedure
Code: Select all
ProcedureDLL HexVal(Txt.s)
Protected Val.l, n.l
Txt = UCase(Txt)
For n = 1 To Len(Txt)
Val << 4 | FindString("123456789ABCDEF", Mid(Txt, n, 1), 1)
Next
ProcedureReturn Val
EndProcedure
ProcedureDLL BinVal(Txt.s)
Protected Val.l
For n = 1 To Len(Txt)
If Mid(Txt, n, 1) = "1"
Val << 1 | 1
Else
Val << 1
EndIf
Next
ProcedureReturn Val
EndProcedure