Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用base64解码十六进制编码的字节_Java_Base64_Hex_Encode - Fatal编程技术网

Java:使用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

十六进制(Base16)编码的字节使用Base64解码而不引发异常?如何区分是否仅使用base16编码器编码

org.apache.commons.codec.binary.Base64.decodeBase64(bytesencodedwithHex)

当上述方法的字节是十六进制编码的数据时,该方法不会引发任何异常或帮助识别它是十六进制编码的。 甚至org.apache.commons.codec.binary.Base64.Base64.isBase64(bytesencodedwithHex)也返回true

下面的示例字符串“Hello”是用十六进制编码的,当我用Base64解码时,它给出了一些废话。在这种情况下,我如何让我的客户知道他们使用了错误的解码器

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;
}