Преобразование строки Java в байтовый массив
У меня есть байтовый массив, который я шифрую, а затем конвертирую в строку, чтобы он мог быть передан. Когда я получаю строку, я должен преобразовать строку обратно в массив байтов, чтобы ее можно было расшифровать. Я проверил, что полученная строка соответствует отправляемой строке (включая длину), но когда я использую что-то вроде str.getBytes(), чтобы преобразовать ее в массив байтов, она не соответствует моему исходному массиву байтов.
Пример вывода:
SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [[email protected]
RECEIVED STR: [[email protected]
RECEIVED: W0JAM2U0YTlhN2Q=
любые идеи, как я могу преобразовать полученную строку в массив байтов, который соответствует массиву отправленных байтов?
Спасибо
Ответы
Ответ 1
Вы использовали array.toString()
, который реализован следующим образом:
return "[[email protected]" + Integer.toString(this.hashCode(), 16);
(На самом деле он наследует определение от Object, а часть перед @
просто является результатом getClass().getName()
.)
И hashCode здесь не зависит от содержимого.
Вместо этого используйте новую строку (массив, кодирование).
Конечно, это работает только для байт-массивов, которые действительно представляют собой строки Java (которые затем содержат читаемые символы), а не для произвольных массивов. Там лучше использовать base64, как рекомендовал Божо (но обязательно используйте его по обе стороны канала).
Ответ 2
Это выглядит как Base64. Взгляните на commons-codec Base64
класс.
Ответ 3
Вы не можете просто использовать getBytes() на двух разных машинах, поскольку getBytes использует кодировку по умолчанию plattform.
Декодировать и кодировать массив с указанной кодировкой (т.е. UTF-8), чтобы убедиться, что вы получили правильные результаты.
Ответ 4
Сначала сделайте преобразование вашего байтового массива в нужную строку, выполнив
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;
}