Page 1 of 1

[R] HexVal, BinVal functions

Posted: Sun Apr 24, 2011 1:02 pm
by Le Soldat Inconnu
Hi,

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
and here functions not optimized

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
Thanks

Re: HexVal, BinVal functions

Posted: Sun Apr 24, 2011 2:34 pm
by Demivec
These functions are already implemented using Val().

Code: Select all

Debug Val("$7D") ;hexadecimal to decimal)
Debug Val("%10") ;binary to decimal

@Edit: corrected typo.

Re: HexVal, BinVal functions

Posted: Sun Apr 24, 2011 2:43 pm
by Le Soldat Inconnu
:D
never see this before

Nice, thanks