让“awids”为基数为64的12个字符长度的ID(A-Z a-z 0-9 "-" "@"
)。这是输入。无法使用java.util.Base64正确编码和解码
我最终的目标是在这些awids和UUID
之间创建一个双射映射,使用一些填充,将awids作为初始输入。
虽然试图使用java.util.Base64
我没有得到解码和编码后的初始值。我做什么愚蠢的错误? :)
随着再现的例子目前我输出下面是错误的,因为后一个decode()
输入字符串未得到后面 - encode()
和双射不保留(Q39s/L
Q39s/A
和既映射到相同的值)。
------------------------------------------>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])
这里一个是重复的例子:
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());
}
}
不要犹豫指向任何其他错误,我在代码做,即使他们不直接相关的问题。谢谢。
你说得对。谢谢。我将12个编码的字符分成8 + 4个字符,这将导致我6字节(msb)+ 3字节(lsb)。 – Costin
我在发布问题后发现了清除的资源(是的,我知道我应该开始使用它)https://en.wikipedia.org/wiki/Base64 – Costin