2015-11-15 5 views
2

Я пытаюсь выполнить XOR две строки, а затем снова XOR вывод с одной строкой, чтобы получить другую строку. Иногда он работает как ожидалось, но иногда он дает неожиданный результат.XOR двух строк не работает, когда размер строк большой

private static byte[] xorData(byte[] data1, byte[] data2) throws UnsupportedEncodingException{ 
    String l1s=new String(data1); 
    String l2s=new String(data2); 
    int l1=data1.length; 
    int l2=data2.length; 
    if(l1>l2) 
    { 
     while(l1s.length()!=l2s.length()){ 
      l2s=l2s+"0"; 
     } 
    } 
    if(l1<l2) 
    { 
     while(l1s.length()!=l2s.length()){ 
      l1s=l1s+"0"; 
     } 
    } 
    data1=l1s.getBytes(); 
    data2=l2s.getBytes(); 
    System.out.println("data1 len "+data1.length); 
    System.out.println("data2 length "+data2.length); 
    byte[] result=new byte[data1.length]; 
    for(int i=0;i<data1.length;i++){ 
      result[i]=(byte)(data1[i]^data2[i%data2.length]); 
     } 

    System.out.println("*********final resulttttttt******************* "+new String(result,"UTF-8")); 
    return result; 
} 

Аналогичным образом я буду выполнять XOR с выходом вышеописанного метода и первой строки, чтобы получить вторую строку. Примечание. К этому методу я передаю массив байтов вместо передачи String

+3

Почему бы вам преобразовать двоичные данные в строки, чтобы начать? Вы конвертируете его в строки, а затем снова ... это очень странный код. –

+1

байты не являются символами, и наоборот. –

+0

Можете ли вы дать нам некоторый контекст? Чего вы пытаетесь достичь? Каковы ваши ожидаемые результаты? –

ответ

0

Конструктор, который вы используете для построения строк, это byte[] constructor для типа String, который, я думаю, делает что-то другое, чем то, что вы ожидаете. Эта функция работает, пытаясь декодировать необработанные байты как некоторая кодировка кодовых точек Юникода, а не как последовательность отдельных значений char. Например, если ваша платформа планирует использовать кодировки UTF-8, она может интерпретировать последовательность байтов как кодировку одного символа, а не как несколько отдельных байтов. В результате преобразование в и из String с использованием этого конструктора, скорее всего, испортит ваши данные.

Если вы хотите, чтобы XOR объединил все байты в конечный массив, не проходите через посредника String. Вместо этого просто прямо XOR байты в массивах.

Похоже, что в основном вы использовали тип String, чтобы вы могли прокладывать входные массивы, чтобы получить их до того же размера. Если это так, а не маршрутизации через String с, попробовать что-то вроде этого:

byte[] result = new Byte[Math.max(data1.length, data2.length)]; 
for (int i = 0; i < result.length; i++) { 
    byte first = (i < data1.length? data1[i] : (byte)0); 
    byte second = (i < data2.length? data2[i] : (byte)0); 
    result[i] = (byte)(first^second); 
}