2012-03-04 84 views
2

我是Java初学者,我有我需要转换为字符串的字节数组。
之后,我想把它从字符串改回字节数组。
我尝试下面的代码,但由于从2号线的返回值没有工作原始数组不匹配:将字节数组转换为字符串,然后再将其返回到字节数组

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

:)这只是一个示例介绍了如何转换我的,肯定comData会在真实情况下不可用:) – Mtaraby 2012-03-04 19:12:01

+1

你如何比较两个阵列? – 2012-03-04 19:12:10

回答

5

如果这是一个任意收集字节,也就是说,它是不实际上编码的文本,那么我建议你使用base64。有一个public domain library available,这使得它很容易(或各种其他第三方库)。

示例代码:

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()比较两个数组。这两个测试数组是否是相同的对象,而不是它们是否具有相同的内容。

+0

如果它不是* UTF-8编码的数据,指定UTF-8是一个坏主意。有很多字节序列,它们不是有效的UTF-8。 – 2012-03-04 19:29:16

+0

@JonSkeet UTF-8就是一个例子,OP应该使用与数据相关的任何编码。当然,如果这些字节根本不是字符数据,那么使用类似base 64的字符编码字节(正如您在答案中所建议的那样)就是要走的路。 – 2012-03-04 19:45:34

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(); 
} 

您遇到的主要问题是,您尝试使用字节值作为构造器...,然后将字符串转换为字节。 你应该把它转换成char和使用简单的铸造,在这种情况下,它将是相同的0和1s。

注意,因为我不把所有在我的脑海中的Java API有些名称可能会有所不同;)

+1

字节和字符之间不一定有1-1对应关系。 – 2012-03-04 19:11:23

+0

是的,但直接投射会使其保持完整,目标不是打印字符串,而是将其暂时保存在字符串中。 – 2012-03-04 19:12:38

+0

如果目标确实是打印出字符串,那么Base64就是要走的路。 – 2012-03-04 19:12:50

相关问题