Simple Hex/Bin/Dec number converter

Share your advanced PureBasic knowledge/code with the community.
Baldrick
Addict
Addict
Posts: 860
Joined: Fri Jul 02, 2004 6:49 pm
Location: Australia

Simple Hex/Bin/Dec number converter

Post by Baldrick »

Nothing special about this little snippet, just a quick little converter I have made up to suit my purposes to convert between decimal, hex & binary in 8 & 16 bits. It could easily be improved, but for what I wanted it does the job I want as is.
Please feel free to finish/improve as you see fit. :)

Code: Select all

   #Title="Quick Number Converter"
Enumeration
  #Window_0
  #Text_Label_Input
  #Label_HexIn
  #String_Hex_In
  #Label_HexBin
  #Out_HexBin
  #Label_HexDec
  #Out_HexDec
  #Label_BinIn
  #String_Bin_In
  #Label_BinHex
  #Out_BinHex
  #Label_BinDec
  #Out_BinDec
  #Label_Dec_In
  #String_Dec_In
  #Label_DecBin
  #Out_DecBin
  #Label_DecHex
  #Out_DecHex
  #Label_Outputs
EndEnumeration 

Procedure SelectAll(textfocus)
   SendMessage_(GadgetID(textfocus),#EM_SETSEL,0,-1) 
   SetActiveGadget(textfocus)
EndProcedure

Procedure.s Hex2Bin(In$) 
   Dec=Val("$"+In$)
      If In$<>"" 
         Select Dec 
            Case 0 To 255 
               ProcedureReturn RSet(Bin(Dec),8,"0")  
            Case 256 To 65535
               ProcedureReturn RSet(Bin(Dec),16,"0")  
         EndSelect 
      EndIf 
EndProcedure 

Procedure.s Hex2Dec(In$) 
   Dec=Val("$"+In$) 
      If In$<>"" 
         Select Dec 
            Case 0 To 65535 
               ProcedureReturn Str(Dec) 
         EndSelect 
      EndIf 
EndProcedure 

Procedure.s Bin2Hex(In$) 
   Dec=Val("%"+In$) 
      If In$<>"" 
         Select Dec 
            Case 0 To 65535 
               ProcedureReturn Hex(Dec) 
         EndSelect 
      EndIf
EndProcedure 

Procedure.s Bin2Dec(In$) 
   Dec=Val("%"+In$) 
      If In$<>"" 
         Select Dec 
            Case 0 To 65535 
               ProcedureReturn Str(Dec) 
         EndSelect 
      EndIf
EndProcedure 

Procedure.s Dec2Hex(In$) 
   Dec=Val(In$) 
      If In$<>"" 
         Select Dec 
            Case 0 To 65535 
               ProcedureReturn Hex(Dec) 
         EndSelect 
      EndIf
EndProcedure 

Procedure.s Dec2Bin(In$) 
   Dec=Val(In$) 
      If In$<>"" 
         Select Dec 
            Case 0 To 255 
               ProcedureReturn RSet(Bin(Dec),8,"0") 
            Case 256 To 65535 
               ProcedureReturn RSet(Bin(Dec),16,"0")
         EndSelect 
      EndIf
EndProcedure 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 347, 185, #Title,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) 
      TextGadget(#Text_Label_Input, 10, 10, 30, 20, "Inputs")
      TextGadget(#Label_HexIn, 10, 30, 40, 20, "Hex In")
      StringGadget(#String_Hex_In, 10, 50, 107, 20, "")
      TextGadget(#Label_HexBin, 130, 30, 110, 20, "Binary Out (8 or 16 bit)")
      TextGadget(#Out_HexBin, 130, 50, 107, 20, "", #PB_Text_Border)
      TextGadget(#Label_HexDec, 250, 30, 60, 20, "Decimal Out")
      TextGadget(#Out_HexDec, 250, 50, 80, 20, "", #PB_Text_Border)
      TextGadget(#Label_BinIn, 10, 80, 50, 20, "Binary In")
      StringGadget(#String_Bin_In, 10, 100, 107, 20, "")
      TextGadget(#Label_BinHex, 130, 80, 50, 20, "Hex Out")
      TextGadget(#Out_BinHex, 130, 100, 107, 20, "", #PB_Text_Border)
      TextGadget(#Label_BinDec, 250, 80, 60, 20, "Decimal Out")
      TextGadget(#Out_BinDec, 250, 100, 80, 20, "", #PB_Text_Border)
      TextGadget(#Label_Dec_In, 10, 130, 60, 20, "Decimal In")
      StringGadget(#String_Dec_In, 10, 150, 107, 20, "")
      TextGadget(#Label_DecBin, 130, 130, 110, 20, "Binary Out (8 or 16 bit)")
      TextGadget(#Out_DecBin, 130, 150, 107, 20, "", #PB_Text_Border)
      TextGadget(#Label_DecHex, 250, 130, 50, 20, "Hex Out")
      TextGadget(#Out_DecHex, 250, 150, 80, 20, "", #PB_Text_Border)
      TextGadget(#Label_Outputs, 130, 10, 40, 20, "Outputs") 
   ProcedureReturn 1   
  EndIf
EndProcedure 

If Not Open_Window_0() 
   MessageRequester(#Title,"Error, unable to initialise main window",#MB_ICONERROR) 
   End 
EndIf 

Repeat 
   Ev=WaitWindowEvent() 
   Et=EventType() 
      Select Et
         Case #PB_EventType_Change 
            Select EventGadget() 
             Case #String_Hex_In 
               txtIn$=GetGadgetText(#String_Hex_In)
               SetGadgetText(#Out_HexBin,Hex2Bin(txtIn$)) 
               SetGadgetText(#Out_HexDec,Hex2Dec(txtIn$)) 
             Case #String_Bin_In 
               txtIn$=GetGadgetText(#String_Bin_In) 
               SetGadgetText(#Out_BinHex,Bin2Hex(txtIn$)) 
               SetGadgetText(#Out_BinDec,Bin2Dec(txtIn$)) 
             Case #String_Dec_In 
               txtIn$=GetGadgetText(#String_Dec_In) 
               SetGadgetText(#Out_DecHex,Dec2Hex(txtIn$)) 
               SetGadgetText(#Out_DecBin,Dec2Bin(txtIn$)) 
            EndSelect 
         Case #PB_EventType_Focus 
            Select EventGadget() 
               Case #String_Hex_In 
                  SelectAll(#String_Hex_In) 
               Case #String_Bin_In 
                  SelectAll(#String_Bin_In) 
               Case #String_Dec_In 
                  SelectAll(#String_Dec_In) 
            EndSelect 
      EndSelect  

      If Ev=#PB_Event_CloseWindow 
         Quit=1 
      EndIf 
Until Quit 
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Post by rsts »

Very handy. Saves me always having to google for a tool.

Thanks for sharing.
User avatar
Alireza
Enthusiast
Enthusiast
Posts: 143
Joined: Sat Aug 16, 2008 2:02 pm
Location: Iran

Post by Alireza »

Thanks for sharing
I think that's useful
User avatar
Kaeru Gaman
Addict
Addict
Posts: 4826
Joined: Sun Mar 19, 2006 1:57 pm
Location: Germany

Post by Kaeru Gaman »

> Saves me always having to google for a tool.

... you guys know that the windows CALC.exe has a HEX Button in the scientific Layout?
oh... and have a nice day.
User avatar
Rook Zimbabwe
Addict
Addict
Posts: 4322
Joined: Tue Jan 02, 2007 8:16 pm
Location: Cypress TX
Contact:

Post by Rook Zimbabwe »

I done wrote this about 4 months ago... Let me contribute:

Code: Select all

; BINcalc by Ralph Wm Dunn
; (c) 2008 - All National and International Rights Reserved
; Please don't claim this project as your own!
;
Enumeration
    #Window_BINCALC
EndEnumeration

Enumeration
    #Button_CLEAR
    #Button_EQUAL
    #Button_DIVIDE
    #Button_MULTIPLY
    #Button_CVTFROM
    #Button_CONVERT
    #Button_MINUS
    #Button_PLUS
    #Button_1
    #Button_0
    #String_OUT
    #Font
EndEnumeration

LoadFont(#Font, "Courier", 14)

Structure VisualDesignerGadgets
    Gadget.l
    EventFunction.l
EndStructure

Global NewList EventProcedures.VisualDesignerGadgets()
Global value.q ; new value enteres
Global oldvalue$ ; last value entered
Global value$
Global value
Global oldvalue
Global number$
Global DOFLAG
Global ANSWERFLAG
;-
Procedure Equalize(DOFLAG)
    ; ** DOFLAG tells us what to do mathematically
    SetGadgetText(#String_OUT, "")
    value$ = "%" + value$
    Debug "VQ = "+ value$
    value = Val(value$)
    Debug "VQ in: " +Str(value)
    oldvalue = ValQ(oldvalue$)
    Debug "OLDvalue: "+Str(oldvalue)
    
    Debug "VALUES: "+Str(oldvalue)+"  And  "+Str(value)
    
    Select DOFLAG
        Case 1 ; ADD
            answer = oldvalue + value
            Debug "+ = "+Str(answer)
            value = answer
        Case 2 ; SUBTRACT
            
            answer = oldvalue - value
            Debug "SUB: "+Str(answer)
            If answer < 0
                answer = 0
            EndIf
            value = answer
        Case 3 ; multiply
            answer = oldvalue * value
            Debug "X: "+Str(answer)
            value = answer
        Case 4 ; divide
            answer = oldvalue / value
            Debug "DIV/ = "+Str(answer)
            If answer < 0
                answer = 0
            EndIf
            value = answer
    EndSelect
    
    Result$ = BinQ(Value)
    Debug "ANSWER: "+Result$
    oldvalue$ = "%"+ Result$; ValQ(Result$) ; BinQ(value)
    SetGadgetText(#String_OUT, Result$)
    value$ = ""
    DOFLAG = 0
    ANSWERFLAG = 1
EndProcedure

Procedure Button_EQUAL_Event(Window, Event, Gadget, Type)
    Debug "#Button_CLEAR"
    Equalize(DOFLAG)
    number$ = ""
    value = 0
    oldvalue = 0
    value$ = ""
    oldvalue$ = "%0"
    ANSWERFLAG = 0
EndProcedure

Procedure Button_CLEAR_Event(Window, Event, Gadget, Type)
    Debug "#Button_CLEAR"
    number$ = ""
    value = 0
    oldvalue = 0
    value$ = ""
    oldvalue$ = "%0"
    ANSWERFLAG = 0
    SetGadgetText(#String_OUT, "")
EndProcedure
;-
Procedure Button_PLUS_Event(Window, Event, Gadget, Type)
    Debug "#Button_PLUS"
    ANSWERFLAG = 0
    DOFLAG = 1
    SetGadgetText(#String_OUT, "")
    Equalize(DOFLAG)
EndProcedure

Procedure Button_MINUS_Event(Window, Event, Gadget, Type)
    Debug "#Button_MINUS"
    ANSWERFLAG = 0
    DOFLAG = 2
    SetGadgetText(#String_OUT, "")
    Equalize(DOFLAG)
EndProcedure

Procedure Button_DIVIDE_Event(Window, Event, Gadget, Type)
    Debug "#Button_DIVIDE"
    DOFLAG = 3
    SetGadgetText(#String_OUT, "")
    Equalize(DOFLAG)
EndProcedure

Procedure Button_MULTIPLY_Event(Window, Event, Gadget, Type)
    Debug "#Button_MULTIPLY"
    DOFLAG = 4
    SetGadgetText(#String_OUT, "")
    Equalize(DOFLAG)
EndProcedure
;-
Procedure Button_CVTFROM_Event(Window, Event, Gadget, Type)
    Debug "#Button_CVTFROM"
    number$ = GetGadgetText(#String_OUT)
    value = ValQ(number$)
    Result$ = BinQ(Value)
    value = ValQ(Result$)
    SetGadgetText(#String_OUT, Result$)
EndProcedure

Procedure Button_CONVERT_Event(Window, Event, Gadget, Type)
    Debug "#Button_CONVERT"
    number$ = "%"
    newnumb$ = GetGadgetText(#String_OUT)
    number$ = number$ + newnumb$
    value = ValQ(number$)
    Result$ = Str(value)
    SetGadgetText(#String_OUT, Result$)
EndProcedure
;-
Procedure Button_1_Event(Window, Event, Gadget, Type)
    Debug "#Button_1"
    If ANSWERFLAG = 0
        value$ = GetGadgetText(#String_OUT)
        value$ = value$ + "1"
        SetGadgetText(#String_OUT, value$)
    EndIf
    If answerflag = 1
        SetGadgetText(#String_OUT, "")
        value$ = value$ + "1"
        SetGadgetText(#String_OUT, value$)
    EndIf
EndProcedure

Procedure Button_0_Event(Window, Event, Gadget, Type)
    Debug "#Button_0"
    If ANSWERFLAG = 0
        value$ = GetGadgetText(#String_OUT)
        value$ = value$ + "0"
        SetGadgetText(#String_OUT, value$)
    EndIf
    If answerflag = 1
        SetGadgetText(#String_OUT, "")
        value$ = value$ + "0"
        SetGadgetText(#String_OUT, value$)
    EndIf
EndProcedure
;-
Procedure String_OUT_Event(Window, Event, Gadget, Type)
    ;*
EndProcedure
;-
Procedure RegisterGadgetEvent(Gadget, *Function)
    
    If IsGadget(Gadget)
        AddElement(EventProcedures())
        EventProcedures()\Gadget        = Gadget
        EventProcedures()\EventFunction = *Function
    EndIf
    
EndProcedure

Procedure CallEventFunction(Window, Event, Gadget, Type)
    
    ForEach EventProcedures()
        If EventProcedures()\Gadget = Gadget
            CallFunctionFast(EventProcedures()\EventFunction, Window, Event, Gadget, Type)
            LastElement(EventProcedures())
        EndIf
    Next
    
EndProcedure
;-
Procedure Open_Window_BINCALC()
    
    If OpenWindow(#Window_BINCALC, 0, 0, 265, 340, "BinCALC - 0.2",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
        If CreateGadgetList(WindowID(#Window_BINCALC))
            StringGadget(#String_OUT, 5, 10, 255, 25, "", #PB_Text_Center)
            RegisterGadgetEvent(#String_OUT, @String_OUT_Event())
            ButtonGadget(#Button_0, 5, 40, 80, 55, "0")
            RegisterGadgetEvent(#Button_0, @Button_0_Event())
            ButtonGadget(#Button_1, 95, 40, 80, 55, "1")
            RegisterGadgetEvent(#Button_1, @Button_1_Event())
            ButtonGadget(#Button_PLUS, 180, 40, 80, 55, "+")
            RegisterGadgetEvent(#Button_PLUS, @Button_PLUS_Event())
            ButtonGadget(#Button_MINUS, 180, 100, 80, 55, "-")
            RegisterGadgetEvent(#Button_MINUS, @Button_MINUS_Event())
            ButtonGadget(#Button_CONVERT, 5, 220, 170, 55, "CONVERT TO REAL NUMBER", #PB_Button_MultiLine)
            RegisterGadgetEvent(#Button_CONVERT, @Button_CONVERT_Event())
            ButtonGadget(#Button_CVTFROM, 5, 160, 170, 55, "CONVERT FROM REAL NUMBER", #PB_Button_MultiLine)
            RegisterGadgetEvent(#Button_CVTFROM, @Button_CVTFROM_Event())
            ButtonGadget(#Button_MULTIPLY, 180, 160, 80, 55, "X")
            RegisterGadgetEvent(#Button_MULTIPLY, @Button_MULTIPLY_Event())
            ButtonGadget(#Button_DIVIDE, 180, 220, 80, 55, "/")
            RegisterGadgetEvent(#Button_DIVIDE, @Button_DIVIDE_Event())
            ButtonGadget(#Button_EQUAL, 5, 280, 170, 55, " = EQUAL = ")
            RegisterGadgetEvent(#Button_EQUAL, @Button_EQUAL_Event())
            ButtonGadget(#Button_CLEAR, 5, 100, 170, 55, " CLEAR ")
            RegisterGadgetEvent(#Button_CLEAR, @Button_CLEAR_Event())
            
        EndIf
    EndIf
EndProcedure

SetGadgetFont(#PB_Default, FontID(#Font))

Open_Window_BINCALC()

oldvalue$ = "%0"

Repeat
    
    Event  = WaitWindowEvent(22)
    Gadget = EventGadget()
    Type   = EventType()
    Window = EventWindow()
    
    Select Event
        Case #PB_Event_Gadget
            CallEventFunction(Window, Event, Gadget, Type)
    EndSelect

Until Event = #PB_Event_CloseWindow

End

Binarily speaking... it takes 10 to Tango!!!

Image
http://www.bluemesapc.com/
Post Reply