将Java字符串转换为字节数组

将Java字符串转换为字节数组

问题描述:

我有一个字节数组,我正在加密,然后转换为一个字符串,以便可以传输。当我收到字符串时,我必须将字符串转换回字节数组,以便解密。我已经检查过收到的字符串与发送的字符串(包括长度)匹配,但是当我使用类似str.getBytes()的字符串将其转换为字节数组时,它与我的原始字节数组不匹配。将Java字符串转换为字节数组

示例输出:

SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3 
SENT STR: [[email protected] 
RECEIVED STR: [[email protected] 
RECEIVED: W0JAM2U0YTlhN2Q= 

任何想法如何我可以将所接收的字符串转换为字节阵列所发送的字节数组匹配?

感谢

+3

函数用于转换字符串的字节数组使用: 字符串stringToConvert =“这个字符串长度为76个字符,将被转换为一个字节数组”。 byte [] theByteArray = stringToConvert.getBytes(); – 2011-03-31 12:39:15

+1

W0JAM2U0YTlhN2Q =是[B @ 3e4a9a7d的Base64,它看起来像是Java中字节数组的字符串表示。如果您自己正在执行字节操作,请仔细检查它,因为您可能正在发送错误的数据。 – mdrg 2011-03-31 12:41:41

+0

out是我的字节数组,打印时给出了我的示例输出的第一行。 out.toString()肯定给我[B @ 3e4a9a7d – Mitch 2011-03-31 12:57:41

您使用array.toString(),它是这样实现的:

return "[[email protected]" + Integer.toString(this.hashCode(), 16); 

(事实上,它继承对象的定义,以及@之前根本的getClass().getName()结果的部分)

而且这里的hashCode不依赖于内容。

而是使用新的String(数组,编码)。

当然,这只适用于真正表示为Java字符串(其中包含可读字符)的字节数组,而不适用于任意数组。最好使用像Bozho推荐的base64(但确保在通道的两侧都使用它)。

+0

谢谢,这是对问题的快速解决方案 – Mitch 2011-04-02 00:36:19

这看起来像Base64编码。看看commons-codecBase64课。

+0

我曾尝试使用sun.misc.BASE64Decoder,我认为它非常相似,它似乎并没有为我工作 – Mitch 2011-03-31 12:39:36

+1

@Mitch尝试'string.getBytes(“ISO-8859-1 “)',然后将其作为构造函数来传递。 – Bozho 2011-03-31 12:42:56

+2

@Mitch不使用'sun。*'包中的任何类。他们是专有的API,可能随时被删除。使用任何其他公共实现,比如Bozho建议的实现。 – mdrg 2011-03-31 12:46:59

由于getBytes使用plattform的默认字符集,所以不能在两个不同的机器上使用getBytes()。

使用指定的字符集(即UTF-8)对数组进行解码和编码,以确保获得正确的结果。

首先做你的字节数组正确的琴弦的皈依,通过做

String line= new String(Arrays.toString(your_array)) 

然后把它和使用下面

public static byte[] StringToByteArray(String line) 
{ 

    String some=line.substring(1, line.length()-1);  
    int element_counter=1; 

    for(int i=0; i<some.length(); i++) 
    {   
     if (some.substring(i, i+1).equals(",")) 
     { 
      element_counter++; 
     }  

    } 
    int [] comas =new int[element_counter-1]; 
    byte [] a=new byte[element_counter]; 
    if (a.length==1) 
    { 
     a[0]= Byte.parseByte(some.substring(0)); 
    }  
    else 
    { 
     int j=0; 
     for (int i = 0; i < some.length(); i++) 
     { 
      if (some.substring(i, i+1).equals(",")) 
      { 
       comas[j]=i; 
       j++; 
      } 
     }   
     for (int i=0; i<element_counter; i++) 
     { 
      if(i==0) 
      { 
       a[i]=Byte.parseByte(some.substring(0, comas[i])); 
      } 
      else if (i==element_counter-1) 
      { 
       a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2)); 
      } 
      else 
      { 
       a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i])); 
      } 

     } 
    } 
    return a; 

}