Binaire : comment améliorer ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Binaire : comment améliorer ?

Message par Progi1984 »

Slt, comment pourrais je améliorer ce code sans avoir a passer par les strings ?
merci

Code : Tout sélectionner

Procedure Int_IP(IP.s)
  Protected a1,a2,a3,a4
  Protected b1.s,b2.s,b3.s,b4.s
  Protected c1.s,c2.s,c3.s,c4.s
  a1=Val(Left(IP,FindString(IP,".",0)-1))
  IP=Right(IP,Len(IP)-FindString(IP,".",0))
  a2=Val(Left(IP,FindString(IP,".",0)-1))
  IP=Right(IP,Len(IP)-FindString(IP,".",0))
  a3=Val(Left(IP,FindString(IP,".",0)-1))
  IP=Right(IP,Len(IP)-FindString(IP,".",0))
  a4=Val(IP)
  Debug "-----Valeur décimal-----"
  Debug a1
  Debug a2
  Debug a3
  Debug a4
  b1=Bin(a1)
  b2=Bin(a2)
  b3=Bin(a3)
  b4=Bin(a4)
  Debug "-----Valeur binaire-----"
  Debug b1
  Debug b2
  Debug b3
  Debug b4
  If Len(b1)<>8
  c1.s=RSet(b1,8-Len(b1)+1,"0")
  Else
  c1=b1
  EndIf
  If Len(b2)<>8
  c2.s=RSet(b2,8-Len(b2)+1,"0")
  Else
  c2=b2
  EndIf
  If Len(b3)<>8
  c3.s=RSet(b3,8-Len(b3)+1,"0")
  Else
  c3=b3
  EndIf
  If Len(b4)<>8
  c4.s=RSet(b4,8-Len(b4)+1,"0")
  Else
  c4=b4
  EndIf
  Debug "-----Valeur binaire sur un octect-----"
  Debug c1
  Debug c2
  Debug c3
  Debug c4
  c.s=c1+c2+c3+c4
  Debug "-----Valeurs concaténées-----"
  Debug c
  ProcedureReturn c
EndProcedure

d=Int_IP("192.168.0.1")
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Je t'ai fait ça :)

Code : Tout sélectionner

Procedure.s Int_IP(*Char.BYTE)
   Result.s = "00000000000000000000000000000000"
   *Result.BYTE = @Result
   Nombre.w = 0
   Repeat
      If *Char\b>='0' And *Char\b<='9'
         Nombre = Nombre*10 + *Char\b-48
      ElseIf *Char\b='.' Or *Char\b=0
         Mask = %10000000
         For t=0 To 7
            If Nombre & Mask
               *Result\b = '1'
            EndIf
            *Result + 1
            Mask >> 1
         Next
         If *Char\b=0 : Break : EndIf
         Nombre = 0
      Else
         ProcedureReturn "Error"
      EndIf
      *Char + 1
   ForEver
   If *Result-@Result = 32
      ProcedureReturn Result
   Else : ProcedureReturn "Error"
   EndIf
EndProcedure

Debug Int_IP(@"192.168.0.1")
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

En fait, je cherche le moyen que la fonction renvoie un entier enayant une chaine par paramètre
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

voila un code qui transforme une IP en entier
(on pourrait aussi créer une fonction IsIPv4)

Code : Tout sélectionner

Procedure IsNumeric(str$)
  Protected *c.Byte, Error.l
  
  *c = @str$
  
  While *c\b <> #NUL And Error <> #True
  
    If *c\b < '0' Or *c\b > '9'
      Error = #True
    EndIf
    
    *c + 1
  Wend
  ProcedureReturn Error ! #True
EndProcedure 

Procedure.l IPv4(IPv4.s)
  Protected IP.l, Error.l, i.l, Len.l
  
  Dim Field.s(3)
  
  If CountString(IPv4, ".") = 3
    
    For i = 0 To 3
      Field(i) = StringField(IPv4, i+1, ".")
      Len = Len( Field(i) )
      If Len = 0 Or Len > 3 Or IsNumeric( Field(i) ) = #False
        Error = #True
      EndIf
    Next i
    
    If Error = #False
      For i = 0 To 3
        IP + Val( Field(i) ) << (i * 8)
      Next i
    EndIf
    
  EndIf
  
  ProcedureReturn IP
EndProcedure

machine = IPv4("192.168.0.1")
masque  = IPv4("255.255.0.0")

Debug "machine"
Debug Hex(machine)

reseau = machine & masque

Debug "réseau"
Debug Hex(reseau)
Debug IPString(reseau)
Dri ;)
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Progi1984 a écrit :En fait, je cherche le moyen que la fonction renvoie un entier enayant une chaine par paramètre
Ah! OK! voici un code pour si tu es sur de ton entrée String :

Code : Tout sélectionner

Procedure Int_IP(*Char.BYTE)
   Result = 0
   Nombre.w = 0
   Repeat
      If *Char\b='.' Or *Char\b=0
         Result = Result<<8 + Nombre
         If *Char\b=0 : Break : EndIf
         Nombre = 0
      Else
         Nombre = Nombre*10 + *Char\b-48
      EndIf
      *Char + 1
   ForEver
   ProcedureReturn Result
EndProcedure

Debug Hex(Int_IP(@"192.168.0.1"))
ça permet d'aller plus vite :D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci beaucoup à tous les deux :)
Répondre