Home > Software design >  Error: the encoded message must be a list of integers
Error: the encoded message must be a list of integers

Time:01-04

I am creating a prime encryption program however I am running into a very perplexing error.

This is my code:

import random
import datetime

def decode(encoded_message, p):
    # Initialize an empty list to store the decoded message
    decoded_message = []
    # Iterate over the encoded characters in the encoded message
    for c in encoded_message:
        # Decode each character by subtracting the prime number p from its ASCII value
        decoded_c = chr(int(c) - p)
        # Append the decoded character to the decoded message
        decoded_message.append(decoded_c)
    # Return the decoded message as a string
    return ''.join(decoded_message)
def is_prime(n, k=20):
  # If n is less than 2, it is not prime
  if n < 2:
    return False

  # If n is 2 or 3, it is prime
  if n == 2 or n == 3:
    return True

  # If n is even, it is not prime
  if n % 2 == 0:
    return False

  # Find r and s such that n - 1 = 2^s * r, where r is odd
  s = 0
  r = n - 1
  while r % 2 == 0:
    s  = 1
    r //= 2

  # Repeat k times:
  for _ in range(k):
    a = random.randrange(2, n - 1)
    x = pow(a, r, n)
    if x != 1 and x != n - 1:
      j = 1
      while j < s and x != n - 1:
        x = pow(x, 2, n)
        if x == 1:
          return False
        j  = 1
      if x != n - 1:
        return False
  return True
# Get the key from the user
key = int(input("What is the key?"))

# Check if the key is prime
if not is_prime(key):
  print("Error: the key must be a prime number")
else:
  # Get the encoded message from the user
  encoded_message = list(input("What is the encoded message?"))

  # Check if the encoded message is a list of integers
  if not all(isinstance(i, int) for i in encoded_message):
    print("Error: the encoded message must be a list of integers")
  else:
    # Decode the message
    decoded_message = decode(encoded_message, key)
    print("Your decoded message is:", decoded_message)


  

What I enter is [72, 77, 82, 77, 82, 84, 83, 80, 87, 82, 76, 73, 85] into encoded_message = list(input("What is the encoded message?")) I also enter 5 into key = int(input("What is the key?")) The key input works just fine. I do not know what the problem is with this. I have tried removing brackets and removing the commas, but nothing seems to work...

No matter what I change, I get this error: Error: the encoded message must be a list of integers

CodePudding user response:

In

encoded_message = list(input("What is the encoded message?"))

list(input(...)) takes the string output by input and turns it into a list, so without an input:

>>> list("[1,2,3]")
['[', '1', ',', '2', ',', '3', ']']

The result is obviously not what you want, but use ast.literal_eval instead to have Python parse (some limited) Python syntax so you get an actual list of ints:

>>> import ast
>>> ast.literal_eval("[1,2,3]")
[1, 2, 3]
  • Related