我有一个要加密的字节数组,然后转换为字符串,以便可以传输。 当我收到字符串时,我必须将字符串转换回字节数组,以便可以对其进行解密。 我检查了接收到的字符串是否与发送的字符串(包括长度)匹配,但是当我使用诸如str.getBytes()之类的东西将其转换为字节数组时,它与我的原始字节数组不匹配。
示例输出:
SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [B@3e4a9a7d
RECEIVED STR: [B@3e4a9a7d
RECEIVED: W0JAM2U0YTlhN2Q=
任何想法如何将接收到的字符串转换为与发送的字节数组匹配的字节数组?
谢谢
要将String转换为Byte Array,请使用以下命令:String stringToConvert ="此String的长度为76个字符,将转换为字节数组。" byte [] theByteArray = stringToConvert.getBytes();
W0JAM2U0YTlhN2Q =是[B @ 3e4a9a7d]的Base64,它看起来像Java中字节数组的String表示形式。 如果您自己执行字节操作,请仔细检查它,因为您可能发送了错误的数据。
out是我的字节数组,打印时给出了示例输出的第一行。 out.toString()绝对给了我[B @ 3e4a9a7d
查看代码(部分)会很有帮助
/questions/17577887/
您使用了array.toString(),其实现方式如下:
return"[B@" + Integer.toString(this.hashCode(), 16);
(实际上,它是从Object继承定义的,而@之前的部分只是getClass().getName()的结果。)
并且这里的hashCode不依赖于内容。
而是使用新的String(数组,编码)。
当然,这仅适用于实际上可表示为Java字符串(然后包含可读字符)的字节数组,不适用于任意数组。建议像Bozho一样最好使用base64(但请确保在通道的两侧都使用它)。
谢谢,这是解决问题的快速方法
看起来像Base64。看一下commons-codec Base64类。
我确实尝试过使用sun.misc.BASE64Decoder,我认为它非常相似,而且似乎对我没有用
@Mitch尝试string.getBytes("ISO-8859-1"),然后将其作为构造函数的扩展名传递。
@Mitch不使用sun.*包中的任何类。 它们是专有API,可以随时删除。 使用其他任何公开实现,例如Bozho建议的实现。
您不能只在两台不同的计算机上使用getBytes(),因为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
{
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
{
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;
}