我必须在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);
我陷入了这个问题。
23条答案
按热度按时间wecizke31#
虽然base64编码是安全的,而且有人可能会说“答案是正确的”,但我来到这里是为了寻找一种将java字节数组转换成java字符串的方法。也就是说,字节数组的每个成员在其对应的字符串中保持不变,编码/传输不需要额外的空间。
这个描述8位透明编码的答案对我很有帮助。我曾经
ISO-8859-1
在TB的二进制数据上成功地来回转换(二进制<->字符串),而不需要base64编码所需的膨胀空间,因此对于我的用例ymmv来说是安全的。这也有助于解释何时/是否应该进行实验。
rseugnpd2#
这对我来说很好:
从字符串转换为字节[]:
从字节[]转换为字符串:
bwleehnv3#
从中读取字节
String
使用ByteArrayInputStream
把它包起来BufferedReader
它是字符流而不是字节流,字节流将字节数据转换为字符串。输出为:
萨哈尔是个好孩子
k75qkfdt4#
字符串是字符(16位无符号)的集合。所以如果你要把负数转换成一个字符串,它们会在翻译中丢失。
mhd8tkvw5#
我使用以下方法成功地将字节数组转换为字符串:
cqoc49vn6#
这是工作代码。
g52tjvyc7#
可以使用简单for循环进行转换:
ufj5ltwl8#
尝试在两种转换中指定8位字符集。例如iso-8859-1。
swvgeqrz9#
disho6za10#
我确实注意到了一些答案中没有的东西。您可以将字节数组中的每个字节转换为字符,然后将它们放入char数组中。那么字符串就是
其中cbuf是char数组。若要转换回,请通过将每个字符转换为字节的字符串进行循环,以放入一个字节数组,这个字节数组将与第一个字节数组相同。
sycxhyv711#
尽管
正确吗?它抛出一个
UnsupportedEncodingException
强制您处理选中的异常。您可以使用Java1.6以来的另一个构造函数将字节数组转换为String
:这个不会引发任何异常。
转换回也应该用
StandardCharsets.UTF_8
:同样,您可以避免处理选中的异常。
apeeds0o12#
之间的“适当转换”
byte[]
以及String
是显式声明要使用的编码。如果你从一个byte[]
而且它实际上不包含文本数据,没有“适当的转换”。String
s代表文本,byte[]
对于二进制数据,唯一真正明智的做法是避免在它们之间进行转换,除非您必须这样做。如果你真的要用
String
要保存二进制数据,最安全的方法是使用base64编码。6yoyoihd13#
下面是一些将字节数组转换为字符串的方法。我已经测试过了,效果很好。
gcxthw6b14#
根本问题是(我认为)您无意中使用了一个字符集:
在某些情况下。utf-8就是这种字符集的一个例子。具体来说,某些字节序列在utf-8中不是有效编码。如果utf-8解码器遇到这些序列中的一个,那么它可能会丢弃有问题的字节,或者将它们解码为“没有这样的字符”的unicode码点。当然,当您尝试将字符编码为字节时,结果会有所不同。
解决方案是:
明确你使用的字符编码;i、 e.使用字符串构造函数
String.toByteArray
具有显式字符集的方法。对字节数据使用正确的字符集。。。或者一个(例如“拉丁-1”,其中所有字节序列都Map到有效的unicode字符。
如果您的字节是(真的)二进制数据,并且希望能够通过“基于文本”的通道传输/接收它们,请使用base64编码之类的方法。。。它就是为此而设计的。
dgtucam115#