Page 1 sur 1

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

Publié : mar. 25/mai/2004 18:50
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

Publié : mar. 25/mai/2004 19:57
par Oliv
c'est sympa. Si tu n'as pas envie de continuer à t'embêter, la calculatrice windows le fait aussi :wink:

Publié : mar. 25/mai/2004 20:08
par nico
C'est bon à savoir , je n'y avais jamais fait attention! :)

Publié : mar. 25/mai/2004 20:52
par Oliv
Moi je l'ai ris hier soir

Publié : mar. 25/mai/2004 20:57
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 :)

Publié : mar. 25/mai/2004 21:35
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 !

Publié : mar. 25/mai/2004 22:06
par comtois
Oui le fromage de Bayonne c'est bien connu :)

Publié : mar. 25/mai/2004 22:10
par Backup
.......

Publié : mer. 26/mai/2004 8:15
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 !

Publié : mer. 26/mai/2004 8:30
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:

Publié : mer. 26/mai/2004 9:36
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 :)

Publié : dim. 30/mai/2004 14:57
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 !!!