Lassen Sie "awids" 12 Zeichen Länge IDs in der Basis 64 (A-Z a-z 0-9 "-" "@"
). Dies ist die Eingabe.kann nicht korrekt codieren und entschlüsseln mit java.util.Base64
Mein Ziel ist es, ein bijektives Mapping zwischen diesen awids und UUID
s zu erstellen, mit einigen Paddings, die als erste Eingabe die awids haben.
Beim Versuch, java.util.Base64
zu verwenden, bekomme ich nach einer Decodierung und einer Codierung nicht wieder den Anfangswert. Was ist der dumme Fehler, den ich mache? :)
Mit dem reproduzierbaren Beispiel I unter dem Ausgang präsentieren ist falsch, weil die Eingabezeichenfolge nicht zurück nach einem decode()
bekommen wird - encode()
und die Bijektion nicht erhalten wird (Q39s/L
und Q39s/A
Karte beide auf den gleichen Wert).
------------------------------------------>Q39s/L (6 [51 33 39 73 2f 4c]) 4 [43 7f 6c fc] -> 6 [51 33 39 73 2f 41] ->Q39s/A (6 [51 33 39 73 2f 41]) 4 [43 7f 6c fc] -> 6 [51 33 39 73 2f 41] ->Q39s/A (6 [51 33 39 73 2f 41])
Hier a ein reproduzierbares Beispiel:
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.StringJoiner;
public class StackOverflowQuestion {
public static void main(String[] args) {
String halfAwid = "Q39s/L";
byte[] sigBits = Base64.getDecoder().decode(halfAwid.getBytes(StandardCharsets.UTF_8));
byte[] actualSigBits = Base64.getEncoder().withoutPadding().encode(sigBits);
String actualHalfAwid = new String(actualSigBits, StandardCharsets.UTF_8);
byte[] sigBits2 = Base64.getDecoder().decode(halfAwid.getBytes(StandardCharsets.UTF_8));
byte[] actualSigBits2 = Base64.getEncoder().withoutPadding().encode(sigBits2);
String actualHalfAwid2 = new String(actualSigBits2, StandardCharsets.UTF_8);
System.out.println("----------------------------------------------> "
+ halfAwid + " (" + toHexString(halfAwid) + ") "
+ "\n"
+ " "
+ toHexString(sigBits) + " -> "
+ toHexString(actualSigBits) + " -> "
+ actualHalfAwid + " (" + toHexString(actualHalfAwid) + ") "
+ "\n"
+ " "
+ toHexString(sigBits2) + " -> "
+ toHexString(actualSigBits2) + " -> "
+ actualHalfAwid2 + " (" + toHexString(actualHalfAwid2) + ")"
+ "");
}
private static String toHexString(byte[] bytes) {
StringJoiner joiner = new StringJoiner(" ", "" + bytes.length + " [", "]");
for (byte b : bytes) {
joiner.add(String.format("%02x", b));
}
return joiner.toString();
}
private static String toHexString(String text) {
return toHexString(text.getBytes());
}
}
Zögern Sie nicht, alle anderen Fehler, die ich in dem Code zu tun zeigen, auch wenn sie nicht direkt auf die Frage in Zusammenhang steht. Vielen Dank.
Sie haben Recht. Vielen Dank. Ich werde die 12 verschlüsselten Zeichen in 8 + 4 Zeichen teilen, was mich zu 6 Bytes (msb) + 3 Bytes (lsb) führen wird. – Costin
Klare Ressource, die ich nach dem Posten der Frage gefunden habe (ja, ich weiß, ich hätte damit anfangen sollen) https://en.wikipedia.org/wiki/Base64 – Costin