【发布时间】:2016-07-18 12:56:46
【问题描述】:
让“awids”为 12 个字符长度的 id,以 64 为基数 (A-Z a-z 0-9 "-" "@")。这是输入。
我的最终目标是在这些 awid 和 UUIDs 之间创建一个双射映射,使用一些填充,将 awid 作为初始输入。
尝试使用java.util.Base64 在解码和编码后我没有得到初始值。我犯了什么愚蠢的错误? :)
对于我在下面展示的可重现示例,输出是错误的,因为在decode()-encode() 之后没有返回输入字符串并且没有保留双射(Q39s/L 和 Q39s/A 都映射到同一个值)。
这是一个可重现的例子:
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());
}
}
不要犹豫,指出我在代码中出现的任何其他错误,即使它们与问题没有直接关系。谢谢。
【问题讨论】:
标签: java-8 base64 decode encode