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.