gpt4 book ai didi

java - 解码和编码问题。 android.util.* 和 java.util.* 中 Base64 类的不同实现?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:29 24 4
gpt4 key购买 nike

我正在编写一个应用程序,它使用给定的字符串 str 执行以下操作:

encode(encrypt(encode(stringToBytearray(str))));

Server收到Base64编码后的String,解码->解密->解码,得到App发送过来的String str。

不幸的是,它不适用于所有字符串,长字符串导致长 Base64 字符串,我的服务器抛出以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 5b
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at Main.decode(Main.java:113)
at Main.main(ain.java:33)

字符串的格式为“[string, string, ..., string]”,不带“s”。

就像我上面提到的,对于不太长的字符串(抱歉,我还不能量化长度),这是可行的。所以我认为我的实现是正确的。

奇怪的是,如果我不发送它,而是 decode(decrypt(decode(stringToBytearray(str))));设备本身上的字符串,一切正常。

我的设置:JDK 7, eclipse (adt-bundle, android 开发) (Windows 7)

JDK 8,eclipse('普通'java)(Linux(xubuntu))

是否因为两个类 (Base64) 的实现方式不同?如果是这样,我怎样才能让它发挥作用?

编码/解码方法如下:

编码(设备:Windows 7、adt-bundle、Android-Dev、jdk 7):

import android.util.Base64

public byte[] encode(byte[] bytearrayToEncode){
return Base64.encode(bytearrayToEncode, Base64.NO_WRAP|Base64.URL_SAFE);
}

解码(服务器:在 Linux 上,jdk 8):

import java.util.Base64

public byte[] decode(byte[] bytearrayToEncode){
return Base64.getUrlDecoder().decode(bytearrayToDecode);
}

所有字符串都使用相同的字符集 (utf-8) 进行解码/编码!编码/解码:Base64

加密:AES

如果您需要更多信息,尽管询问,但我想我已经提供了所有必要的信息。

编辑:

public String bytearrayToString(byte[] bytearray){
String str = null;
try {
str = new String(bytearray, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}

public byte[] stringToBytearray(String str){
byte[] bytearray = null;
try {
bytearray = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bytearray;
}

最佳答案

您必须使用 JSONObjects 将 Base64 字符串发送到服务器。如果是这样,则 JSONObject 将向字符串中添加“\”转义字符,这是非法的 Base64 字符。你需要做的就是

String rectifiedString = Base64String.replace("\\","");

在使用获取的字符串之前在服务器端。

可选

同样在服务端使用

import javax.xml.bind.DatatypeConverter;

String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);

byte[] result = DatatypeConverter.parseBase64Binary(str);

相反。

它不仅可以完成工作,而且编码/解码速度更快(as benchmarked here)。

关于java - 解码和编码问题。 android.util.* 和 java.util.* 中 Base64 类的不同实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com