org.apache.commons.codec.DecoderException:奇数个字符

时间:2015-01-12 14:46:40

标签: java javascript apache encode

在url参数中发送十六进制字符串并尝试将其转换为服务器端的字符串。 使用以下javascript编码代码转换用户输入字符串

function encode(string) {
     var number = "";
        var length = string.trim().length;
        string = string.trim();
        for (var i = 0; i < length; i++){
            number += string.charCodeAt(i).toString(16);
            }
        return number;
}

现在我尝试在java代码中解析俄语字符419的十六进制字符串Й,如下所示

  byte[] bytes = "".getBytes();

   try {
        bytes = Hex.decodeHex(hex.toCharArray());
        sb.append(new String(bytes,"UTF-8"));
    } catch (DecoderException e) {      
      e.printStackTrace(); // Here it gives error 'Odd number of characters'
    }catch (UnsupportedEncodingException e) {           
      e.printStackTrace();
    }

但它会出现以下错误

"org.apache.commons.codec.DecoderException: Odd number of characters." 

如何解决。因为有许多俄语字符有十六进制代码3位数,因此它无法将其转换为.toCharArray()

3 个答案:

答案 0 :(得分:0)

改为使用Base64

val aes = KeyGenerator.getInstance("AES")
aes.init(128)
val secretKeySpec = aes.generateKey()
val base64 = Base64.encodeToString(secretKeySpec.encoded, 0)
val bytes = Base64.decode(base64, 0)
SecretKeySpec(bytes, 0, bytes.size, "AES") == secretKeySpec

答案 1 :(得分:0)

在您提到Й是U + 0419的情况下,大多数西里尔字符以0开头。这显然意味着在转换前在奇数字符数组前添加0会有所帮助。

测试javascript似乎仅对1个字母长的字符串可能是安全的:Ѓ(U + 0403)返回403,Ѕ(U + 0405)返回405,但是ЃЅ返回403405而不是04030405或4030405,甚至更糟糕的是,因为它是偶数的,并且不会触发异常,并且可以解码为完全不同的东西。

This有关用前导零填充的问题可能有助于javascript部分。

答案 2 :(得分:-1)

而不是

    sb.append(new String(bytes,"UTF-8"));

试试这个

    sb.append(new String(bytes,"Windows-1251"));