我有一个字节数组,我正在加密然后转换为字符串,以便可以传输。当我收到字符串时,我必须将字符串转换回字节数组,以便解密。我已检查收到的字符串是否与发送的字符串匹配(包括长度),但是当我使用str.getBytes()之类的东西将其转换为字节数组时,它与我的原始字节数组不匹配。
示例输出:
SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [B@3e4a9a7d
RECEIVED STR: [B@3e4a9a7d
RECEIVED: W0JAM2U0YTlhN2Q=
任何想法如何将接收到的字符串转换为与发送的字节数组匹配的字节数组?
由于
答案 0 :(得分:16)
您使用了array.toString()
,其实现方式如下:
return "[B@" + Integer.toString(this.hashCode(), 16);
(实际上它继承了Object的定义,而@
之前的部分只是getClass().getName()
的结果。)
此处的hashCode不依赖于内容。
相反,使用新的String(数组,编码)。
当然,这只适用于字节数组,它实际上可以表示为Java字符串(然后包含可读字符),而不是任意数组。最好使用像Bozho推荐的base64(但一定要在频道的两边使用它)。
答案 1 :(得分:5)
这看起来像Base64。请查看commons-codec Base64
课程。
答案 2 :(得分:4)
你不能只在两台不同的机器上使用getBytes(),因为getBytes使用了plattform的默认字符集。
使用指定的字符集(即UTF-8)对数组进行解码和编码,以确保获得正确的结果。
答案 3 :(得分:1)
首先通过执行
将字节数组转换为正确的字符串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;
}