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

Posted

技术标签:

【中文标题】org.apache.commons.codec.DecoderException:奇数个字符【英文标题】:org.apache.commons.codec.DecoderException: Odd number of characters 【发布时间】:2015-03-10 09:01:02 【问题描述】:

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

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

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()

【问题讨论】:

找到解决方案了吗? 有什么解决办法吗? 【参考方案1】:

改用 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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

代替

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

试试这个

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

【讨论】:

以上是关于org.apache.commons.codec.DecoderException:奇数个字符的主要内容,如果未能解决你的问题,请参考以下文章

线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/commons/codec/DecoderException

Android 开发:Java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String()

ANDROID : java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String in

Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.codec

如何使用org.apache.commons.codec.binary.base64对Java对象进行Base64编码?

JAVA导入jar包