PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eindeutige und reversible Kodierung zweier Zahlen?



MacLeod
25.07.2011, 14:54
Mahlzeit,

ich hab hier zwei (max) zehnstellige Zahlen, die ich irgendwie eindeutig in ein max zwölfstelligen Feld kodieren muss. Das ganze natürlich reversibel, da ich bei Zahlen wieder brauche.
Hab mir grad schon die Finger wund gegoogelt, aber nichts brauchbares gefunden ...

Jemand eine Idee?

LG
MacLeod

fireball
25.07.2011, 14:57
Ist das 12stellige Feld numerisch, oder haste da mehr Möglichkeiten? Wenn mehr (also z.B. Buchstaben), kann man doch sehr schön auf eine Zahlenbasis deutlich größer als 10 umschwenken (Hexadezimal langt nicht, aber unter Zuhilfenahme des kompletten Buchstabensatzes von a-z sollte man locker hinkommen ;) )

http://en.wikipedia.org/wiki/Hexavigesimal

1. 10stellige Zahl -> nach "base26" ;) - vorne Stellen mit 0 auffüllen auf 6 Stellen
2. 10stellige Zahl -> siehe 1.

Strings concatenieren -> fertig

rückwärts entsprechend (String in der Hälfte teilen, zurückwandeln)


Edit: Hexavidesimal langt nicht, wenn man noch 0-9 dazunimmt, kommt man langsam hin... zur Not Sonderzeichen, Gross/Kleinbuchstaben...



http://snippets.dzone.com/posts/show/4594

(http://snippets.dzone.com/posts/show/4594)

MacLeod
25.07.2011, 15:14
Der zwölfstellige Wert ist ein Char-Feld (Abap-Type C).

fireball
25.07.2011, 15:22
Ja dann ist das doch kein Problem - brauchst nur nen hinreichenden Zeichenvorrat :) - oder muss das lesbar bleiben? Dann wirds blöd... ;)

MacLeod
25.07.2011, 15:26
Nö muss nicht lesbar bleiben, ist programmintern. Hauptsache ich bekomm den Key zum Schluss wieder eindeutig in seine zwei Ausgangswerte zerlegt ...

fireball
25.07.2011, 15:28
Joa - dann siehe oben. Die Lösung steht ja schon komplett da - und beschränkt sich auf ca. 20 Zeilen Code, so über den Daumen... 40 Zeichen müssten reichen.

kzuse
25.07.2011, 16:58
Schonmal was von Base64 gehört? :)

Das ist sogar absolut standardisiert und es gibt in jeder gängigen Programmiersprache Funktionen oder Bibliotheken um damit zu arbeiten.
Damit kriegste deine zwei Zahlen locker in 12 Stellen unter.

Base64 nutzt, wie der Name vermuten läßt, ein Zahlensystem zur Basis 64 und nutzt für dessen Repräsentation die Zahlen 0-9, das kleine (a-z) sowie das große (A-Z) Alphabet, einige normale, druckbare ASCII-Zeichen (wie .,-=()!?; etc.) - insgesamt eben 64 mögliche Zeichen - und lässt sich somit in allen alphanumerischen Feldern speichern.

Es wird z.B. auch genutzt, um Binärdateien per E-Mail zu versenden, oder Grafiken "inline" in HTML zu kodieren etc. (Das sind dann so Strings wie "=\qiNffASDUuifAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAjbdfAAAAAAAAAAA" oder so - nur natürlich meistens noch was länger.... ;).

Gruß kzuse

BergH
25.07.2011, 17:10
tach auch !

Man könnte natürlich auch
Gödelisieren:
http://de.wikipedia.org/wiki/G%C3%B6delisierung

;)

fireball
25.07.2011, 18:12
Schonmal was von Base64 gehört?

Vollkommen egal, ob Base64 oder Base40 oder selbstprogrammieren, um es zu verstehen ;)

MacLeod
26.07.2011, 19:51
Ich habs anders gelöst, den Algorithmus wollte nicht so ganz unter ABAP ...

Arno
27.07.2011, 11:27
Genau sowas hab ich unter ABAP schon mal programmiert - das gleiche Problem hatte ich nämlich auch schon mal. ;)
Zusätzlich war der Zeichenvorrat (A-Z, a-z, 0-9) durcheinandergewürfelt, damit nicht auf Anhieb erkennbar ist, wie die Zahlen in dem Wert kodiert sind - das Ergebnis wurde als Bestätigungscode o.ä. verwendet.

MacLeod
27.07.2011, 11:35
Hab einfach eine interne Tabelle genommen, die drei Spalten hat: S1 eindeutiger Keywert, S2+3 die beiden zu merkenden Werte.

Ansonsten kannst Du mir gern mal Deinen Code per PM schicken, sofern es kein Dienstgeheimnis darstellt und Du dann Ärger bekommst ;)

Arno
27.07.2011, 13:59
Ein Dienstgeheimnis würde der Code bestimmt nicht darstellen, aber ich arbeite seit einigen jahren schon nicht mehr bei der großen Firma mit den drei Buchstaben, die ABAP auf dem Gewissen hat - von daher komme ich auch nicht mehr an den Code ran. ;)

Quentin
27.07.2011, 14:12
In welchem System isses drin? Ich kann nachgucken :D

Gruß,
Quentin

Arno
27.07.2011, 15:20
Oh je, bis Du das gefunden hast, hat MacLeod das mehrfach neu programmiert (wenn's das überhaupt noch gibt) :) Ich weiß ja nicht mal mehr, wann das war, in welchem Programm oder in welchem System (vermutlich seinerzeit BCE oder AHR, aber sicher bin ich mir nicht).

(wenn Dich jetzt trotzdem der Ehrgeiz packt: FLECKA oder d028477 sind gute Startpunkte ;))