Преобразовать строку Java в байтовый массив - PullRequest
15 голосов
/ 31 марта 2011

У меня есть байтовый массив, который я шифрую, а затем преобразую в строку, чтобы она могла быть передана.Когда я получаю строку, мне нужно преобразовать строку обратно в байтовый массив, чтобы ее можно было расшифровать.Я проверил, что полученная строка соответствует отправленной строке (включая длину), но когда я использую что-то вроде str.getBytes () для преобразования его в байтовый массив, он не совпадает с моим исходным байтовым массивом.

примервывод:

SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3
SENT STR: [B@3e4a9a7d
RECEIVED STR: [B@3e4a9a7d
RECEIVED: W0JAM2U0YTlhN2Q=

есть идеи, как мне преобразовать полученную строку в байтовый массив, который соответствует отправленному байтовому массиву?

Спасибо

Ответы [ 4 ]

16 голосов
/ 31 марта 2011

Вы использовали array.toString(), который реализован следующим образом:

return "[B@" + Integer.toString(this.hashCode(), 16);

(Фактически он наследует определение от Object, а часть перед @ просто является результатом getClass().getName().)

И хэш-код здесь не зависит от содержимого.

Вместо этого используйте новую строку (массив, кодировка).

Конечно, это работает только для байта-массивы, которые действительно представимы в виде строк Java (которые затем содержат читаемые символы), а не для произвольных массивов.Там лучше использовать base64, как рекомендовано Bozho (но обязательно используйте его с обеих сторон канала).

5 голосов
/ 31 марта 2011

Это похоже на Base64. Взгляните на commons-codec Base64 class.

4 голосов
/ 31 марта 2011

Вы не можете просто использовать getBytes () на двух разных машинах, так как getBytes использует набор символов по умолчанию для платформы.

Расшифруйте и закодируйте массив с помощью указанной кодировки (то есть UTF-8), чтобы убедиться, что вы получите правильные результаты.

1 голос
/ 11 июля 2013

Сначала выполните преобразование вашего байтового массива в правильную строку, выполнив

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;

}
...