将字节数组转换为字符串,然后再将其转换回字节数组

4

我是Java的初学者,我有一个字节数组需要转换成字符串。
然后我想把它再从字符串转换回字节数组。
我尝试了下面的代码,但是它不起作用,因为第2行的返回值与原始数组不匹配:

byte[] comData = byteArray;
String value = new String(comData);
byte[] comData2 = value.getBytes();
// comData2 does not equal comData 

这只是一个示例,解释了我如何进行转换,当然在实际情况中comData将不可用 :) - Mtaraby
1
你是如何比较这两个数组的? - Ted Hopp
3个回答

5
如果这是一个任意的字节集合,即它实际上不是编码文本,那么我建议您使用base64。有一个公共领域库可以让它变得容易(或其他各种第三方库)。
示例代码:
byte[] originalData = ...
String base64 = Base64.encode(myByteArray);
byte[] decoded = Base64.decode(base64);

您的原始代码假定数据表示以平台默认编码编码的文本。您几乎总是应该避免使用平台默认编码 - 如果您确实想使用文本编码,通常最好指定一个,例如:
byte[] encodedText = text.getBytes("utf-8");

当然,如果您正在解码二进制数据,则无法选择编码 - 您需要知道要使用哪种编码。

0

返回的数组与原始数组不匹配有点奇怪。然而,可能存在一些微妙的字符编码问题。尝试为字节指定一个明确的编码,例如:

byte[] comData = byteArray;
String value = new String(comData, "UTF-8");
byte[] comData2 = value.getBytes("UTF-8");

System.out.println(Arrays.equals(comData, comData2) ? "Success" : "Failure");

既然你说你是Java的初学者,值得注意的是你不能使用==.equals()来比较两个数组。这两个方法都测试数组是否为同一对象,而不是它们是否具有相同的内容。


如果数据不是UTF-8编码的,指定UTF-8是一个坏主意。有很多字节序列根本不是有效的UTF-8。 - Jon Skeet
@JonSkeet UTF-8只是一个示例,OP应该使用与数据相关的编码方式。当然,如果这些字节根本不是字符数据,那么使用类似于base64的方法对字节进行编码就是正确的方法(正如你在你的答案中建议的那样)。 - Ted Hopp

0

尝试这样做:

byte[] comData = byteArray;
String value = new String();
for(byte me : comData)
{
    value += (char)me;
}
byte[] comData2;
{
    List<byte> temp;
    for(int i=0; i<value.size(); i++)//it may be value.length(), I don't remember
    {
        temp.add(byte(value.getChar(i)));
    }
}
comData2 = temp.getArray();
}

主要的问题是你试图将字节值用作构造函数,然后将字符串转换为字节。你应该使用简单的类型转换将其转换为字符,这样它就会保持相同的0和1。
注意:由于我没有所有Java API都记在脑子里,所以一些名称可能会有所不同 ;)

1
字节和字符之间不一定存在一对一的对应关系。 - Ted Hopp
是的,但是直接转换将保持其完整性,目标不是打印字符串,而是暂时将其保存在字符串中。 - user1241335
如果目标确实是打印字符串,那么Base64是可行的方法。 - user1241335
OP 没有说明为什么需要将字节转换为字符串。 - Ted Hopp
是的,但他似乎没有对其进行任何操作,可能只是对其进行编码/解码。在这种情况下,强制转换更有效率。 - user1241335
@Shingetsu:这通常是一个不好的想法(而且你做得非常低效)。像这样的请求通常是在需要传输文本的情况下 - 在这种情况下,拥有无法打印的字符是灾难的配方。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接