我必须将字节数组转换为Android中的字符串,但我的字节数组包含负值。
如果我将该字符串再次转换为字节数组,我得到的值与原始字节数组值不同。
我该怎么做才能得到正确的转换?我用来做转换的代码如下:
// Code to convert byte arr to str:
byte[] by_original = {0,1,-2,3,-4,-5,6};
String str1 = new String(by_original);
System.out.println("str1 >> "+str1);
// Code to convert str to byte arr:
byte[] by_new = str1.getBytes();
for(int i=0;i<by_new.length;i++)
System.out.println("by1["+i+"] >> "+str1);
我被这个问题难住了。
在Android上使用Kotlin,我发现为此目的创建一些简单的扩展函数非常方便。
基于Base64编码/解码的解决方案,能够通过JSON, XML等传递:
import android.util.Base64
fun ByteArray.encodeToString() = String(Base64.encode(this, Base64.NO_WRAP), Charsets.UTF_8)
fun String.decodeToBytes(): ByteArray = Base64.decode(toByteArray(Charsets.UTF_8), Base64.NO_WRAP)
所以你可以使用它
val byteArray = byteArrayOf(0, 1, 2, -1, -2, -3)
val string = byteArray.encodeToString()
val restoredArray = string.decodeToBytes()
尽管
new String(bytes, "UTF-8")
如果是正确的,它会抛出一个UnsupportedEncodingException,迫使你处理一个checked异常。你可以使用自Java 1.6以来的另一个构造函数来将字节数组转换为String:
new String(bytes, StandardCharsets.UTF_8)
这个函数不会抛出任何异常。
转换回也应该用StandardCharsets完成。UTF_8:
"test".getBytes(StandardCharsets.UTF_8)
同样,您可以避免处理受控异常。