Java:使用base64解码十六进制编码的字节
十六进制(Base16)编码的字节使用Base64解码而不引发异常?如何区分是否仅使用base16编码器编码 org.apache.commons.codec.binary.Base64.decodeBase64(bytesencodedwithHex) 当上述方法的字节是十六进制编码的数据时,该方法不会引发任何异常或帮助识别它是十六进制编码的。 甚至org.apache.commons.codec.binary.Base64.Base64.isBase64(bytesencodedwithHex)也返回true 下面的示例字符串“Hello”是用十六进制编码的,当我用Base64解码时,它给出了一些废话。在这种情况下,我如何让我的客户知道他们使用了错误的解码器Java:使用base64解码十六进制编码的字节,java,base64,hex,encode,Java,Base64,Hex,Encode,十六进制(Base16)编码的字节使用Base64解码而不引发异常?如何区分是否仅使用base16编码器编码 org.apache.commons.codec.binary.Base64.decodeBase64(bytesencodedwithHex) 当上述方法的字节是十六进制编码的数据时,该方法不会引发任何异常或帮助识别它是十六进制编码的。 甚至org.apache.commons.codec.binary.Base64.Base64.isBase64(bytesencodedwithHe
System.out.println(new
String(org.bouncycastle.util.encoders.Hex.encode("Hello".getBytes())));
System.out.println(new String(org.bouncycastle.util.encoders.Base64.decode("48656c6c6f".getBytes())));
每个十六进制字符串都是合法的Base64字符串 十六进制编码为您提供一个表示原始字符串字节的字符串,该字符串由0-9和a-F组成。Base64编码为您提供一个对原始字符串进行编码的字符串,该字符串仅由可打印字符组成(当然,其中包括0-9和a-F) 因此,由0-9,A-F组成的每个字符串都可以表示一个十六进制字符串,但也可以表示一个Base64字符串(恰好只有0-9,A-F)
您将需要一种不同的方式来告诉用户所使用的编码。例如,将编码类型的结构与字符串一起发送,或发送原始字符串的长度(因此,如果在解码后得到错误的长度-这不是正确的编码模式) 每个十六进制字符串都是合法的Base64字符串 十六进制编码为您提供一个表示原始字符串字节的字符串,该字符串由0-9和a-F组成。Base64编码为您提供一个对原始字符串进行编码的字符串,该字符串仅由可打印字符组成(当然,其中包括0-9和a-F) 因此,由0-9,A-F组成的每个字符串都可以表示一个十六进制字符串,但也可以表示一个Base64字符串(恰好只有0-9,A-F)
您将需要一种不同的方式来告诉用户所使用的编码。例如,将编码类型的结构与字符串一起发送,或发送原始字符串的长度(因此,如果在解码后得到错误的长度-这不是正确的编码模式) 有些字符串是以64为基数或以16为基数的,没有任何线索 但有一些线索:
- 如果长度()%2!=0则它必须是Base64
- 如果length()%3==1,则存在伪6位,不能为Base64。因为它必须是Base16,所以偶数length()%2==0必须保持不变
- 所有字母很可能是大写或小写
- 缺少特殊的“数字”
和/
,以及+
G-Zg-z
有些字符串是以64为基数或以16为基数的,没有任何线索 但有一些线索:
- 如果长度()%2!=0则它必须是Base64
- 如果length()%3==1,则存在伪6位,不能为Base64。因为它必须是Base16,所以偶数length()%2==0必须保持不变
- 所有字母很可能是大写或小写
- 缺少特殊的“数字”
和/
,以及+
G-Zg-z
为什么要它抛出异常?十六进制值(如“10ab”)是合法的base64字符串。。。你能举例说明你的意见吗?谢谢回复@Shir。我在主要问题中添加了详细信息。为什么希望它抛出异常?十六进制值(如“10ab”)是合法的base64字符串。。。你能举例说明你的意见吗?谢谢回复@Shir。我在主要问题中补充了细节。
boolean probablyHex(String s) {
if (s.endsWith("=")) { // Base64 padding char (optional).
return false;
}
s = s.replaceAll("[^-_+/A-Za-z0-9]", ""); // MIME safe Base64 variant too.
if (s.matches(".*[-_+/G-Zg-z].*")) {
return false;
}
int n = s.length();
if (n % 2 == 1) {
return false;
}
if (n % 3 == 1) { // Spurious char with 6 bits data.
return true;
}
// Very unlikely that it is Base64, but you might have a bias towards Base64:
if (!s.equals(s.toUpperCase(Locale.US)) && !s.equals(s.toLowerCase(Locale.US)) {
// Mixed cases in A-Fa-f:
// For small texts that is significantly incoherent, meaning Base64.
return n > 32;
}
return true;
}