2014-01-25 3 views
0

Я пытаюсь написать программу на языке python, которая будет содержать строки XOR 2. В настоящее время мой код выглядит следующим образом:«IndexError: string index out of range» с помощью программы Python

cipherText1 = "00101100 10110101 11100110 00010100 11000100 00001110 10110011 00100101 11001101 11001110 11000000 01000001 00001000 10000100 10110101 11100100 10110010 00001100 10110110 00111100 00111001 11111001 00111011 01110010 00000111 00010000 10110010 10110100 10100010 11010110 01101011 01110110 01011000 10000001 00101001 11010010 01000001 01110010 11111010 11110000 11101111 10000100 11001010 00000010 10110011 11111000 10011011 01110001 10001110 10101111 00101010 01111011 10100111 10100001 00111110 01000100 01001010 01110111 01110010 11101101 01111001 10110011 11011011 01101100 01100010 00011100 00000010 10100000 11010011 00101110 11000000 10011100 01010001 00001111 11001101 00111001 10110001 11000111 01101101 01110001 01010101 00000111 11011110 10000110 00110100 11010010 00010111 11011100 11101011 00110011 11001011 01001101 00001100 10110000 00110000 10011011 01011000 10111111 10001001 11100100 11100010 01111110 01101010 10110000 10100010 01001100 00110010 11111001 01111101 10000010 00000000 00010011 11001110 11111100 11010011 01010100 00001000 11100001 00101101 00010001 01100100 01001001 00101000 10100011 01101000 01010010 01101101 00010100 10000010 01010000 00111001 10010101 11000000 11010011 10010010 00010001 01100100 11111100 00001011 00110000 00010011 00101001 11111111 10110001 10101010 11000001 00111111 01100110 11011100 10101010 00100001 10100110 11110110 00111110 00110111 00010011 00001000 10111110 00010010 00110110 01101101 11100000 11100110 10001101 10110010 01110111 01010001 11101100 00010010 11111001 11100000 00101001 01110110 10111100 01010010 10110010 10100010 10001000 10001111 00000111 01100000 10001101 00100110 10100110 00110111 10100100 01101111 00000011 10100110 11110001 10100001 10101011" 

key1 = "01111010 10111110 11010100 00100100 01011101 11101100 00001010 01011101 11110001 01111100 01100111 00101101 01111001 10010100 10001000 11000111 10110101 11101111 01011011 10010001 00010000 11000100 00111110 00001100 00111110 10101110 01011000 01101100 00100001 10110111 00110110 10010000 10010101 01010110 10011111 11000011 10101010 00001100 11000010 11001101 11101001 01001010 00110110 00101100 11000110 11100111 10010000 00101011 10001011 10110001 10111101 01101101 00110010 11110011 01011000 11011000 11100111 00001001 00011110 01111110 10001100 01001000 10111001 11111010 00101010 10101011 11100001 01010111 10010011 00101000 11001111 10100001 10001110 01010101 10010010 01111100 01011110 10011100 01111101 01010000 11001100 10111010 01011011 01011111 01001110 00010111 00111011 01100000 01101011 01100101 10101001 01011100 01101111 01101100 00100111 10111001 11111010 10001011 01001000 00101100 01000101 11001110 10010110 00000101 01110000 00001000 01010110 10000110 10011011 00101011 11101011 01111111 01100110 00111011 11110110 00100100 01001001 00000010 10101011 01010111 10111111 01101000 00011010 00110001 11111101 10111110 10000110 11010111 00010000 01111101 10101010 01111100 11000101 00111101 11001111 11110110 01100011 00111100 10110111 10100101 10010001 01010000 10001101 10100010 10011110 00010000 00010110 11011100 10000101 00100001 00011111 10000011 00000101 00101110 11111100 10001110 10011000 01111110 01001101 01011100 11110101 10111010 11000100 00000111 11101110 00011000 01110111 10010101 11011011 10111010 01110010 00101110 10001011 00110110 01010000 11000101 01010101 11010001 00011001 11000101 01010110 01110110 10100101 11111111 10010000 10101111 01101010 00001110 10101011 10111011 10100100 01110111" 

message1 = "" 

cipherText1.replace(" ", "") 

key1.replace(" ", "") 

for i in range(len(cipherText1)): 
    message1[i-1] += (int(cipherText1[i-1]) + int(key1[i-1])) % 2 

print(message1) 

Я получаю эту ошибку, когда я пытаюсь запустить его: «message1 [я-1] + = (интермедиат (cipherText1 [я-1]) + INT (key1 [i- 1]))% 2 IndexError: индекс строки из диапазона»

ответ

3

message1 пустая строка, поэтому любой индекс на нем приводит к IndexError:

>>> ""[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: string index out of range 

Вам нужно построить список символов f рвые затем присоединиться впоследствии:

message = [] 

for i in range(len(cipherText1)): 
    message.append(<next character>) 

print(''.join(message)) 

Ваш цикл начинается i = 0, так что вы индексировать первый символ с конца с -1.

Вы бы лучше из не обращая внимания на пробелы и превращая каждый байт в в целое число:

message = [] 

for c, k in zip(cipherText1.split(), key1.split()): 
    newval = int(c, 2)^int(k, 2) 
    message.append(format(newval, '08b')) 

print(' '.join(message)) 

Это дает:

>>> print(' '.join(message)) 
01010110 00001011 00110010 00110000 10011001 11100010 10111001 01111000 00111100 10110010 10100111 01101100 01110001 00010000 00111101 00100011 00000111 11100011 11101101 10101101 00101001 00111101 00000101 01111110 00111001 10111110 11101010 11011000 10000011 01100001 01011101 11100110 11001101 11010111 10110110 00010001 11101011 01111110 00111000 00111101 00000110 11001110 11111100 00101110 01110101 00011111 00001011 01011010 00000101 00011110 10010111 00010110 10010101 01010010 01100110 10011100 10101101 01111110 01101100 10010011 11110101 11111011 01100010 10010110 01001000 10110111 11100011 11110111 01000000 00000110 00001111 00111101 11011111 01011010 01011111 01000101 11101111 01011011 00010000 00100001 10011001 10111101 10000101 11011001 01111010 11000101 00101100 10111100 10000000 01010110 01100010 00010001 01100011 11011100 00010111 00100010 10100010 00110100 11000001 11001000 10100111 10110000 11111100 10110101 11010010 01000100 01100100 01111111 11100110 10101001 11101011 01101100 10101000 11000111 00100101 01110000 01000001 11100011 10000110 01000110 11011011 00100001 00110010 10010010 10010101 11101100 11101011 11000011 10010010 00101101 10010011 11101001 00000101 11101110 01011101 11100111 00000111 11000000 10111100 10010101 10000010 01111001 01110010 00010011 00110100 11010001 00101001 10111010 01011001 10001011 00111110 00100101 11110011 00010000 11001011 10011101 10010000 11000000 01011111 01101010 10011000 01011010 00100010 10001010 01011100 01101111 00100110 01111001 11001001 01000011 10010010 00000111 11111101 10001010 00000010 01110111 11110111 01011001 10010110 11000010 00110110 11111011 10000011 01011001 10100111 00001011 00000101 00001101 00001101 01001010 00000101 11011100 
0

Вы пытаетесь присвоить определенной позиции строки, что невозможно, поскольку строки неизменяемы. Сделайте message список, затем верните его в строку (если нужно) в конце.

0

Несколько вещей:

  1. str.replace возвращает новую строку, необходимо связать его: key1 = key1.replace(" ", "");
  2. Первое значение i in range(len(cipherText1)) - 0, поэтому вы будете индексировать -1 или последний символ в строках;
  3. 1 + 1 % 2 == 1 + (1 % 2) == 2 - круглые скобки бесплатны, используйте (x + y) % 2; и
  4. (Причина вашей ошибки): вы не можете индексировать строку нулевой длины "" (или, если на то пошло, пустой список). Начните с message = [] (пустым списком) и используйте .append(), чтобы добавить в него символы.
0

Вот пример сценария, как XOR две строки битов:

import sys 

KEY = "00101100 10110101 11100110 00010100 11000100 00001110 10110011 00100101 11001101 11001110 11000000 01000001 00001000 10000100 10110101 11100100 10110010 00001100 10110110 00111100 00111001 11111001 00111011 01110010 00000111 00010000 10110010 10110100 10100010 11010110 01101011 01110110 01011000 10000001 00101001 11010010 01000001 01110010 11111010 11110000 11101111 10000100 11001010 00000010 10110011 11111000 10011011 01110001 10001110 10101111 00101010 01111011 10100111 10100001 00111110 01000100 01001010 01110111 01110010 11101101 01111001 10110011 11011011 01101100 01100010 00011100 00000010 10100000 11010011 00101110 11000000 10011100 01010001 00001111 11001101 00111001 10110001 11000111 01101101 01110001 01010101 00000111 11011110 10000110 00110100 11010010 00010111 11011100 11101011 00110011 11001011 01001101 00001100 10110000 00110000 10011011 01011000 10111111 10001001 11100100 11100010 01111110 01101010 10110000 10100010 01001100 00110010 11111001 01111101 10000010 00000000 00010011 11001110 11111100 11010011 01010100 00001000 11100001 00101101 00010001 01100100 01001001 00101000 10100011 01101000 01010010 01101101 00010100 10000010 01010000 00111001 10010101 11000000 11010011 10010010 00010001 01100100 11111100 00001011 00110000 00010011 00101001 11111111 10110001 10101010 11000001 00111111 01100110 11011100 10101010 00100001 10100110 11110110 00111110 00110111 00010011 00001000 10111110 00010010 00110110 01101101 11100000 11100110 10001101 10110010 01110111 01010001 11101100 00010010 11111001 11100000 00101001 01110110 10111100 01010010 10110010 10100010 10001000 10001111 00000111 01100000 10001101 00100110 10100110 00110111 10100100 01101111 00000011 10100110 11110001 10100001 10101011" 
MESSAGE = "01111010 10111110 11010100 00100100 01011101 11101100 00001010 01011101 11110001 01111100 01100111 00101101 01111001 10010100 10001000 11000111 10110101 11101111 01011011 10010001 00010000 11000100 00111110 00001100 00111110 10101110 01011000 01101100 00100001 10110111 00110110 10010000 10010101 01010110 10011111 11000011 10101010 00001100 11000010 11001101 11101001 01001010 00110110 00101100 11000110 11100111 10010000 00101011 10001011 10110001 10111101 01101101 00110010 11110011 01011000 11011000 11100111 00001001 00011110 01111110 10001100 01001000 10111001 11111010 00101010 10101011 11100001 01010111 10010011 00101000 11001111 10100001 10001110 01010101 10010010 01111100 01011110 10011100 01111101 01010000 11001100 10111010 01011011 01011111 01001110 00010111 00111011 01100000 01101011 01100101 10101001 01011100 01101111 01101100 00100111 10111001 11111010 10001011 01001000 00101100 01000101 11001110 10010110 00000101 01110000 00001000 01010110 10000110 10011011 00101011 11101011 01111111 01100110 00111011 11110110 00100100 01001001 00000010 10101011 01010111 10111111 01101000 00011010 00110001 11111101 10111110 10000110 11010111 00010000 01111101 10101010 01111100 11000101 00111101 11001111 11110110 01100011 00111100 10110111 10100101 10010001 01010000 10001101 10100010 10011110 00010000 00010110 11011100 10000101 00100001 00011111 10000011 00000101 00101110 11111100 10001110 10011000 01111110 01001101 01011100 11110101 10111010 11000100 00000111 11101110 00011000 01110111 10010101 11011011 10111010 01110010 00101110 10001011 00110110 01010000 11000101 01010101 11010001 00011001 11000101 01010110 01110110 10100101 11111111 10010000 10101111 01101010 00001110 10101011 10111011 10100100 01110111" 

def xor_strings(key, message): 
    "XORs each bit in two strings" 
    result = "" 

    for i, character in enumerate(message): 
     if character == " ": 
      result = result + character 
     else: 
      result = '%s%s' % (result, int(character)^int(key[i])) 

    return result 

if __name__ == '__main__': 
    if len(sys.argv) == 1: 
     key = KEY 
     message = MESSAGE 
    else: 
     if len(sys.argv) != 3: 
      print('Usage: %s [key message]' % __file__) 
      sys.exit(0) 
     else: 
      key, message = sys.argv[1:] 

    print(xor_strings(key, message)) 
Смежные вопросы