Java zahlen mit radix > Charakter.MAX_RADIX
Habe ich ein fünf-Zeichen-String und ich will diese fünf Zeichen als ASCII-codierte (printable) - Nummer. Der einfachste Weg dies zu erreichen ist die Verwendung
Long.toString(number, Character.MAX_RADIX);
Diese geben mir zahlen von "0"
zu "zzzzz"
. Leider Long.toString(int, int)
unterstützt nur Kleinbuchstaben, nicht Großbuchstaben. Dies bedeutet, dass die max radix ist 36
und die höchste Zahl, die ich codieren kann ist 36^5 - 1 = 60 466 175
. Wenn ich könnte die beiden unteren und Großbuchstaben, die ich bekommen würde, eine max radix von 62
und die höchste kodierbare Zahl ist 62^5 - 1 = 916 132 831
.
Abgesehen vom kopieren Long
's source-code und Erweiterung der möglichen Ziffern, gibt es irgendeinen anderen Ort, den ich in Aussehen sollte, zunächst, wo dies bereits umgesetzt?
- Vielleicht möchten Sie sich für Base64 Encoder und Decoder (z.B., commons.apache.org/codec/apidocs/org/apache/commons/codec/...), die zwei zusätzliche Symbole für die Codierung.
- sehen WhiteFang ' s Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht angeben, ob oder nicht die Zeichen werden müssen druckbare ASCII:
Wenn Sie das tun, dann können Sie gehen, um
95^5
. Es gibt 95 druckbaren ASCII-Zeichen aus dem Weltall (SP) zu tilde (~).Wenn Sie nicht, dann Sie gehen können, um
128^5
==2^35
.Entweder der Algorithmus für die Umwandlung ist einfach, und ist einfacher als eine Erweiterung
Long.toString(...)
. (Die Sie vermutlich nicht haben, um sorgen über die Zeichen, Bereich Fehler oder Löcher in den Charakter<->
Ziffer zuordnen. Es wäre einfacher, code dieses von Grund auf neu.)Aber ich bin mir nicht bewusst, irgendwelche bestehenden Implementierung erweiterter radix-Nummern.
[0-9a-zA-Z]
einige Sonderzeichen wäre auch OK (wie/
,-
,_
usw.)java.lang.Long
. Ich Frage mich nur, wenn ich etwas übersehen, woCharacter.MAX_RADIX
ist nicht die Grenze...Wenn Sie bereit sind, gehen Sie zwei Zeichen über die alphanumerische könnten Sie Base64 Codierung.
Mit
Base64
von Apache-Commons-Codec Sie bekommen konnte 1073741824 möglich, Werte wie diese:=
und==
keinen Extraplatz? Abgesehen davon, dass ich nicht der Meinung, weil die transformation geht vonbyte[]
zuString
, nicht ausNumber
zuString
. Aber ich könnte Griff das extra "Codierung" vonNumber
zubyte[]
=
durch den Einsatz von 3 bytes, eineint
. Geben Sie eine sogar 24 bits werden codiert in 4 Zeichen.256^3 - 1 = 16 777 215
, das ist weniger als meine ursprüngliche Lösung, wo bekomme ich60 466 175
codierbaren Werte==
. Und dann entfernen Sie auch das erste Zeichen werden die bits vonint
, die einfach nicht passen in Ihren 5 Zeichen.Long.toString(int, int)
und das hinzufügen von ein paar der erlaubten Ziffern für den Algorithmus. 🙂 Außerdem verstehe ich nicht, der base64-Algorithmus gut genug, um sicher zu sein, dass das trimmen nicht versehentlich erstellen "Kollisionen", d.h. mehrere zahlen codiert, um den gleichen Wert, das wäre fatal in meinem Fall.