2016-11-16 12 views
0

настоящее время я использую 2 массивы:Замена текста не будет идти правильно с кодированием и декодированием

let letters:[Character] = 
    [" ","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","!","@","#","$","%","^","&","*","(",")","1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","E","S","T","U","V","W","X","Y","Z"] 
let cypher:[Character] = ["o","p","q","r","a","b","c","d","e","f","g","h","i","u","v","w","x","y","z","j","k","l","m","n","s","t","$","@","#","!","&","%","^","*","("," ",")","5","7","2","9","8","0","1","3","2","4","Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M"] 

Оба 73 символов.

Я использую эту строку кода для кодирования вставленный текст:

var encode:[Character:Character] = [:] 

    for (index, letter) in letters.enumerated() { encode[letter] = cypher[index] } 
    let encodeStep1 = String(insertedText.characters.map({ encode[$0] ?? $0 })) 

    randomNumber = Int(arc4random_uniform(9) + 1) 
    var encodeStep2 = cypher.rotate(shift: randomNumber) 

    for (index, letter) in letters.enumerated() { encode[letter] = encodeStep2[index] } 
    let final = String(encodeStep1.characters.map({ encode[$0] ?? $0 })) 

Decode:

var decode:[Character:Character] = [:] 

let step1 = cypher.rotate(shift: (randomNumber)) 
     for (index, letter) in step1.enumerated() { decode[letter] = letters[index] } 
     let step1Decoded = String(insertedEncryptedText.characters.map({ decode[$0] ?? $0 })) 

     for (index, letter) in cypher.enumerated() { decode[letter] = letters[index] } 
     let step2Decoded = String(step1Decoded.characters.map({ decode[$0] ?? $0 })) 

Поворот функции:

extension Array { 
    func rotate(shift:Int) -> Array { 
     var array = Array() 
     if (self.count > 0) { 
      array = self 
      if (shift > 0) { 
       for i in 1...shift { 
        array.append(array.remove(at: 0)) 
       } 
      } 
      else if (shift < 0) { 
       for i in 1...abs(shift) { 
        array.insert(array.remove(at: array.count-1),at:0) 
       } 
      } 
     } 
     return array 
    } 
} 

Для некоторых очень странной причине, номер «3» часто отображается как число «9» при декодировании. Из того, что я видел, проблема возникает на этапе 2Decoded. Я просто не могу понять, что я делаю неправильно. Это, однако, часть кода, если мне нужно опубликовать больше, я могу это сделать.

+0

Где код для 'rotate'? например 'Cypher.rotate (сдвиг: randomNumber)' – Aaron

+0

Привет Аарон, это: вар расшифровывает: [Характер: Характер] = [:] пусть (сдвиг: (randomNumber)) шаг1 = cypher.rotate для (индекс, письмо) в step1.enumerated() {decode [letter] = буквы [index]} let step1Decoded = String (insertEncryptedText.characters.map ({decode [$ 0] ?? $ 0})) для (индекс, буква) в cypher.enumerated() {decode [letter] = letters [index]} let step2Decoded = String (step1Decoded.characters.map ({decode [$ 0] ?? $ 0})) – Petravd1994

+1

OP: Аарон предоставил правдоподобный ответ - - если это правильно, вы должны принять его; если неверно, прокомментируйте его ответ. –

ответ

1

Это потому, что у вас есть опечатка. Ваш массив cypher имеет два «2» в нем, один на cypher[39] и еще 6 индексов далее на cypher[45]. Когда вы заканчиваете декодирование на последнем шаге, вы ожидаете, что decoded["2"] отобразите значение «3» в массиве letters, что он и делает, но он перезаписывается, когда он снова попадает в «2», устанавливая его на значение 6 индексов далее в массиве letters, который имеет значение «9».

Я предполагаю, что вы хотите изменить это второе значение «2» в массиве letters вместо «6» (так как я заметил, что там не было «6»). Это решит вашу проблему.