Page 1 sur 1

Binaire : comment améliorer ?

Publié : ven. 10/févr./2006 1:50
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")

Publié : ven. 10/févr./2006 8:08
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")

Publié : ven. 10/févr./2006 10:55
par Progi1984
En fait, je cherche le moyen que la fonction renvoie un entier enayant une chaine par paramètre

Publié : ven. 10/févr./2006 11:24
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 ;)

Publié : ven. 10/févr./2006 11:59
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

Publié : ven. 10/févr./2006 12:27
par Progi1984
Merci beaucoup à tous les deux :)