Apprendre à lire / écrire en Binaire - Héxadécimal

Partagez votre expérience de PureBasic avec les autres utilisateurs.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Apprendre à lire / écrire en Binaire - Héxadécimal

Message par fweil »

Vala,

J'ai une soeur qui veut apprendre à identifier les numérations binaires et hexa.

Alors j'ai commis ce truc.

Sais pas si on peut faire des trucs mieux mais c'est un début.

Code : Tout sélectionner

Enumeration
  #Window_Main
  #StatusBar
  #Gadget_String_Decimal
  #Gadget_Button_Decimal
  #Gadget_String_Hexadecimal
  #Gadget_Button_Hexadecimal
  #Gadget_String_Binary
  #Gadget_Button_Binary
EndEnumeration

;
; La structure OneByte est utilisée comme intermédiaire de pointage de la chaine argument des fonctions.
; Ce système d'adressage est plus rapide et efficace qu'une analyse par caractère dans une chaine.
;

Structure OneByte
  a.b
EndStructure

;
; IsValid prend la chaine d'un gadget et vérifie que tous les caractères de cette chaine appartiennent à la liste de caractères autorisés dans Mask
;
Procedure IsValid(Gadget.l, Mask.s, Text.s)
  IsValid = #TRUE
  For i = 1 To Len(GetGadgetText(Gadget))
    If FindString(Mask, Mid(GetGadgetText(Gadget), i, 1), 1)
      Else
        IsValid = #FALSE
        SetGadgetText(Gadget, ReplaceString(GetGadgetText(Gadget), Mid(GetGadgetText(Gadget), i, 1), ""))
    EndIf
  Next
  If IsValid = #FALSE
      MessageRequester("Attention", "Les valeurs " + Text + " ne peuvent contenir que des caratères parmi " + Mask, #PB_MessageRequester_OK)
  EndIf
EndProcedure

;
; Conversion d'une chaine de caractères binaire en valeur décimale stockée dans un entier long
;
Procedure.l Bin2Dec(BinaryStringNumber.s)
  *t.OneByte = @BinaryStringNumber
  Result.l = 0
  While *t\a <> 0
    Result = (Result << 1) + (*t\a - 48)
    *t + 1
  Wend
  ProcedureReturn Result
EndProcedure

;
; Conversion d'une chaine de caractères héxadécimale en valeur décimale stockée dans un entier long
;
Procedure.l Hex2Dec(HexNumber.s)
  *t.OneByte = @HexNumber
  Result.l = 0
  While *t\a <> 0
    If *t\a >= '0' And *t\a <= '9'
        Result = (Result << 4) + (*t\a - 48)
      ElseIf *t\a >= 'A' And *t\a <= 'F'
        Result = (Result << 4) + (*t\a - 55)
      ElseIf *t\a >= 'a' And *t\a <= 'f'
        Result = (Result << 4) + (*t\a - 87)
      Else
        Result = (Result << 4) + (*t\a - 55)
    EndIf
    *t + 1
  Wend
  ProcedureReturn Result
EndProcedure

;
; Conversion d'une chaine de caractères décimale en valeur héxadécimale stockée dans une chaine
;
Procedure.s Dec2HexString(DecimalString.s)
  ProcedureReturn Hex(Val(DecimalString))
EndProcedure

;
; Conversion d'une chaine de caractères décimale en valeur binaire stockée dans une chaine
;
Procedure.s Dec2BinString(DecimalString.s)
  ProcedureReturn Bin(Val(DecimalString))
EndProcedure

;
; Conversion d'une chaine de caractères héxadécimale en valeur décimale stockée dans une chaine
;
Procedure.s Hex2DecString(HexadecimalString.s)
  ProcedureReturn Str(Hex2Dec(HexadecimalString))
EndProcedure

;
; Conversion d'une chaine de caractères héxadécimale en valeur binaire stockée dans une chaine
;
Procedure.s Hex2BinString(HexadecimalString.s)
  ProcedureReturn Bin(Hex2Dec(HexadecimalString))
EndProcedure

;
; Conversion d'une chaine de caractères binaire en valeur décimale stockée dans une chaine
;
Procedure.s Bin2DecString(BinaryString.s)
  ProcedureReturn Str(Bin2Dec(BinaryString))
EndProcedure

;
; Conversion d'une chaine de caractères binaire en valeur héxadécimale stockée dans une chaine
;
Procedure.s Bin2HexString(BinaryString.s)
  ProcedureReturn Hex(Bin2Dec(BinaryString))
EndProcedure

;
; Programme principal
;
  WindowXSize = 480
  WindowYSize = 360
  Quit = #FALSE
  OldGadgetText_Decimal.s
  OldGadgetText_Hexadecimal.s
  OldGadgetText_Binary.s
  If OpenWindow(#Window_Main, 0, 0, WIndowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered, "Tests Bin Dec Hex")
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Return, #PB_Shortcut_Return)
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Up, #PB_Shortcut_Up)
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Down, #PB_Shortcut_Down)
      If CreateGadgetList(WindowID())
          SetGadgetFont(#PB_Default, LoadFont(23, "Verdana", 12, #PB_Font_Bold | #PB_Font_HighQuality))
          hStringGadget_Decimal = StringGadget(#Gadget_String_Decimal, 10, 10, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
          SendMessage_(hStringGadget_Decimal, #EM_SETLIMITTEXT, 10, 0)
          ButtonGadget(#Gadget_Button_Decimal, WindowXSize - 70, 10, 60, 40, "OK")
          hStringGadget_Hexadecimal = StringGadget(#Gadget_String_Hexadecimal, 10, 60, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
          SendMessage_(hStringGadget_Hexadecimal, #EM_SETLIMITTEXT, 8, 0)
          ButtonGadget(#Gadget_Button_Hexadecimal, WindowXSize - 70, 60, 60, 40, "OK")
          hStringGadget_Binary = StringGadget(#Gadget_String_Binary, 10, 110, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
          SendMessage_(hStringGadget_Binary, #EM_SETLIMITTEXT, 32, 0)
          ButtonGadget(#Gadget_Button_Binary, WindowXSize - 70, 110, 60, 40, "OK")
      EndIf
      If CreateStatusBar(#StatusBar, WindowID())
      EndIf
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = #TRUE
      Case #PB_Event_Menu
        Select EventMenuID()
          Case #PB_Shortcut_Escape
            Quit = #TRUE
          Case #PB_Shortcut_Return
            Select LastGadgetTouched
              Case #Gadget_String_Decimal
                SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
                SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
              Case #Gadget_String_Hexadecimal
                SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
                SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
              Case #Gadget_String_Binary
                SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
                SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
            EndSelect
          Case #PB_Shortcut_Up
            Select LastGadgetTouched
              Case #Gadget_String_Decimal
                SetGadgetText(#Gadget_String_Decimal, Str(Val(GetGadgetText(#Gadget_String_Decimal)) + 1))
                SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
                SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
              Case #Gadget_String_Hexadecimal
                SetGadgetText(#Gadget_String_Hexadecimal, Str(Val(GetGadgetText(#Gadget_String_Hexadecimal)) + 1))
                SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
                SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
              Case #Gadget_String_Binary
                SetGadgetText(#Gadget_String_Binary, Str(Val(GetGadgetText(#Gadget_String_Binary)) + 1))
                SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
                SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
            EndSelect
          Case #PB_Shortcut_Down
            Select LastGadgetTouched
              Case #Gadget_String_Decimal
                SetGadgetText(#Gadget_String_Decimal, Str(Val(GetGadgetText(#Gadget_String_Decimal)) - 1))
                SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
                SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
              Case #Gadget_String_Hexadecimal
                SetGadgetText(#Gadget_String_Hexadecimal, Str(Val(GetGadgetText(#Gadget_String_Hexadecimal)) - 1))
                SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
                SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
              Case #Gadget_String_Binary
                SetGadgetText(#Gadget_String_Binary, Str(Val(GetGadgetText(#Gadget_String_Binary)) - 1))
                SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
                SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
            EndSelect
        EndSelect
      Case #PB_Event_Gadget
        Select EventGadgetID()
          Case #Gadget_String_Decimal
            If OldGadgetText_Decimal <> GetGadgetText(#Gadget_String_Decimal)
                IsValid(#Gadget_String_Decimal, "-0123456789", "décimales")
                LastGadgetTouched = #Gadget_String_Decimal
                SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
                SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
                OldGadgetText_Decimal = GetGadgetText(#Gadget_String_Decimal)
                Debug "#Gadget_String_Decimal"
            EndIf
            While WindowEvent() : Wend
          Case #Gadget_String_Hexadecimal
            If OldGadgetText_Hexadecimal <> GetGadgetText(#Gadget_String_Hexadecimal)
                IsValid(#Gadget_String_Hexadecimal, "0123456789ABCDEF", "héxadécimales")
                LastGadgetTouched = #Gadget_String_Hexadecimal
                SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
                SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
                OldGadgetText_Hexadecimal = GetGadgetText(#Gadget_String_Hexadecimal)
                Debug "#Gadget_String_Hexadecimal"
            EndIf
            While WindowEvent() : Wend
          Case #Gadget_String_Binary
            If OldGadgetText_Binary <> GetGadgetText(#Gadget_String_Binary)
                IsValid(#Gadget_String_Binary, "01", "binaires")
                LastGadgetTouched = #Gadget_String_Binary
                SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
                SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
                OldGadgetText_Binary = GetGadgetText(#Gadget_String_Binary)
                Debug "#Gadget_String_Binary"
            EndIf
            While WindowEvent() : Wend
          Case #Gadget_Button_Decimal
            SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
            SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
          Case #Gadget_Button_Hexadecimal
            SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
            SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
          Case #Gadget_Button_Binary
            SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
            SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
        EndSelect
    EndSelect
  Until Quit
  EndIf
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

c'est sympa. Si tu n'as pas envie de continuer à t'embêter, la calculatrice windows le fait aussi :wink:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est bon à savoir , je n'y avais jamais fait attention! :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Moi je l'ai ris hier soir
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui mais avec le code de François , tu as le décimal , l'hexa et le binaire en même temps sous les yeux :)

Et puis c'est fait maison ,c'est comme les gâteaux ,c'est bien meilleur :)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

J'adore cuisiner !

Y compris la fondue qui est toute simple sauf que ça nemarche pas tout le temps ..

Au fromage bein sûr ... je viens d'un pays de fromage moi !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Oui le fromage de Bayonne c'est bien connu :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

.......
Dernière modification par Backup le mer. 28/sept./2011 9:29, modifié 1 fois.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Arf, Annecy est une ville très humide alors !

@Comtois ... Le fromage basque c'est pas tip top. Moi je suis Clermontois d'origine controllée !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Clermontois d'origine controllée !
Il est est ou, le tampon des services vétérinaires ? sur la fesse gauche ou droite :mrgreen: :jesors:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

fweil a écrit :@Comtois ... Le fromage basque c'est pas tip top. Moi je suis Clermontois d'origine controllée !

Oui mais bon ,je pensais surtout au Jambon de Bayonne , je ne connais que ça de Bayonne :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

fweil a écrit :Arf, Annecy est une ville très humide alors !
on dirai que tu connais bien !! :D
il fait beau 1 semaine par an ! :lol:
pour ça que je suis parti !!!
Répondre