Ich hatte da mal was gemacht, was Zahlen von einem Zahlensystem in ein anderes übersetzen kann. Wenn man eine Dezimalzahl übersetzt in das 36er-System, dann wird sie auch kürzer.
Code: Alles auswählen
 Procedure.s Base_Convert(Value.s, InBase.l = 10, OutBase.l = 2, nbDecimals.l = 100)
  Protected p.l, *c.Character, left.s, l.l, lout.s, Mod.l, out.s, rout.s, right.s, a.l
 
  *c = @Value
  While *c\c
    Select *c\c
      Case '0' To '9' : *c\c - '0' + 1
      Case 'a' To 'z' : *c\c - 'a' + 11
      Case 'A' To 'Z' : *c\c - 'A' + 11
      Case '.' ;do nothing
      Default : *c\c = 1
    EndSelect
    *c + SizeOf(Character)
  Wend
 
  p = FindString(Value, ".", 1)
  If p
    left = Left(Value, p - 1)
    right = Mid(Value, p + 1, Len(Value) - p)
  Else
    p = Len(Value)
    left = Value
    right = ""
  EndIf
 
  If left ;Vorkommateil
    While left <> ""
      Mod = 0 : *c = @left : out = ""
      While *c\c
        Mod = Mod * InBase + *c\c - 1
        l = Mod / OutBase
        If l Or out
          out + Chr(l + 1)
        EndIf
        Mod - (l * OutBase)
       
        *c + SizeOf(Character)
      Wend
     
      left = out
      lout = Chr(Mod + 1) + lout
    Wend
  Else
    lout = Chr(1)
  EndIf
 
  If right ;Nachkommateil
    a = 0
    p = Len(right)
    While right <> Chr(1) And a < nbDecimals
      *c = @right + (p - 1) * SizeOf(Character)
      p = 0 : Mod = 0 : out = ""
      While *c >= @right
        Mod + (*c\c - 1) * OutBase
        out = Chr((Mod % InBase) + 1) + out
        Mod / InBase
        *c - SizeOf(Character)
        p + 1
      Wend
     
      right = out
      rout + Chr(Mod + 1)
      a + 1
    Wend
  EndIf
 
  If rout : out = lout + "." + rout : Else : out = lout : EndIf
 
  *c = @out
  While *c\c
    Select *c\c
      Case 1 To 10 : *c\c + '0' - 1
      Case 11 To 36 : *c\c + 'A' - 11
      Case '.' ;do nothing
      Default : *c\c = '?'
    EndSelect
    *c + SizeOf(Character)
  Wend
 
  ProcedureReturn out
EndProcedure
Define unkomprimiert.s = "12345678901234567890"
Define komprimiert.s = Base_Convert(unkomprimiert, 10, 36, 100)
Define dekomprimiert.s = Base_Convert(komprimiert, 36, 10, 100)
Debug "Unkomprimiert: " + unkomprimiert
Debug "Komprimiert: " + komprimiert
Debug "Dekomprimiert: " + dekomprimiert
Jetzt könnte man den Code natürlich noch umbauen, sodass mehr als 36 verschiedene Zeichen gehen.
Übrigens kommt der Code auch mit beliebig langen Dezimalzahlen zurecht.