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

4si2a6ki  于 2022-11-16  发布在  Apache
关注(0)|答案(3)|浏览(929)

正在发送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()

yqkkidmi

yqkkidmi1#

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

but5z9lq2#

在你提到的例子中,是U+0419,大多数西里尔字符都以0开头,这显然意味着在转换前在奇数字符数组前加一个0会有所帮助。
测试javascript似乎只对1个字母长的字符串是安全的:(U+0403)返回403,(U+0405)返回405,但返回403405而不是04030405或4030405,这更糟糕,因为它是偶数,不会触发异常,可能解码为完全不同的内容。
This问题处理用前导零填充可能对javascript部分有帮助。

7z5jn7bk

7z5jn7bk3#

代替

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

试试这个

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

相关问题