Base n à base p

Contenu du snippet

Conversion de base N vers base P (où N et P appartiennent à : [2:256])

Source / Exemple :


Public Function ConvertBase(ByVal Value As String, ByVal FromBase As Integer, ByVal ToBase As Integer) As String
  Dim ElemFrom  As String
  Dim ElemTo    As String
  Dim Result    As String
  
  Dim Good      As Boolean
  
  Dim p         As Integer
  
  Dim Data      As Double
  Dim I         As Double
  
  Result = ""
  
  If (FromBase > 1 And FromBase <= 256) And (ToBase > 1 And ToBase <= 256) Then
    ElemFrom = ElemBaseSet(FromBase)
    ElemTo = ElemBaseSet(ToBase)
    
    Data = 0
    Good = True
    I = 1
    Do While I <= Len(Value) And Good
      p = InStr(ElemFrom, Mid(Value, I, 1))
      Good = (p > 0)
      If Good Then
        Data = Data + (p - 1) * FromBase ^ (Len(Value) - I)
        I = I + 1
      End If
    Loop
    
    If Good Then
      Do While Data >= ToBase
        I = Data Mod ToBase
        Result = Mid(ElemTo, I + 1, 1) & Result
        Data = Data \ ToBase
      Loop
      If Data <> 0 Then Result = Mid(ElemTo, Data + 1, 1) & Result
    End If
  End If
  
  ConvertBase = Result
End Function
Private Function ElemBaseSet(ByVal Base As Integer) As String
  Dim I         As Integer
  
  Dim Elem      As String
  
  Elem = ""
  
  If Base <= 10 Or Base <= 62 Then
    For I = 0 To -(Base - 1) * (Base <= 10) - 9 * (Base > 10)
      Elem = Elem & CStr(I)
    Next I
    Base = Base - 10
    If Base > 0 And Base <= 52 Then
      For I = 0 To -(Base - 1) * (Base <= 26) - 25 * (Base > 26)
        Elem = Elem & Chr(65 + I)
      Next I
      Base = Base - 26
      If Base > 0 And Base <= 26 Then
        For I = 0 To -(Base - 1) * (Base <= 26) - 25 * (Base > 26)
          Elem = Elem & LCase(Chr(65 + I))
        Next I
      End If
    End If
  Else
    For I = 0 To 255
      Elem = Elem & Chr(I)
    Next I
  End If
  
  ElemBaseSet = Elem
End Function

Conclusion :


Si la valeur passé au paramettre VALUE contient des "symboles" n'appartenenant pas à la base de référence "FromBase" la fonction retourne rien.

Et tant pis si ca existe déjà.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.