Преобразование строки 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;

}