Python - ValueError: invalid literal for int() with base 2: " "

 
Vista:

ValueError: invalid literal for int() with base 2: " "

Publicado por Alejandro (1 intervención) el 15/11/2019 22:51:56
Este es el código para pasar de texto (cadenas) a binario y viceversa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def encriptar():
    mensaje=input('Digita el mensaje que quieres codificar:\n')
    binario ="".join(f"{ord(i):08b}" for i in mensaje)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido encriptado con éxito\n')
    print('El mensaje codificado es el siguiente:\n')
    print(" ".join(f"{ord(i):08b}" for i in mensaje))
    return binario
 
def desEncriptar(encriptado):
    texto="".join(f"{ord(i):08b}" for i in encriptado)
    bits = int(texto,2)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido desencriptado con éxito\n')
    print('El mensaje descodificado es el siguiente:\n')
    print(bits.to_bytes((bits.bit_length() + 7) // 8, 'big').decode())
 
def menu():
    obtener=''
    print('_______________________________________________')
    print('\t\t BIENVENIDO AL FORMATEADOR DE MENSAJES\n')
    opcion=int(input('Elige un opción\n\n1.Encriptar mensaje\n2.Desencriptar mensaje\n3.Salir\n'))
    if(opcion==1):
      obtener=encriptar()
      menu()
    elif(opcion==2):
      desEncriptar(obtener)
      menu()
    else:
      print('La opción no está disponible')
      menu()
menu()

Lo había hecho antes de corrido, es decir, sin métodos, y funcionaba de maravilla, tal vez es la forma en la que estoy gestionando las variables.

Éste es el código original

1
2
3
4
s='hello student'
test="".join(f"{ord(i):08b}" for i in s)
bits = int(test, 2)
print(bits.to_bytes((bits.bit_length() + 7) // 8, 'big').decode())


Les agradezco.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

ValueError: invalid literal for int() with base 2: " "

Publicado por tincopasan (1085 intervenciones) el 17/11/2019 01:29:00
hola:
le hice unas pequeñas modificaciones, para mí aún le faltan muchas cosas a mejorar, pero está funcional en base a tu planteo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#-*- coding: utf -8 -*-
obtener = ''   #debe estar fuera de la función sino cada vez que la llames será una cadena vacía
 
def encriptar():
 
    mensaje=input('Digita el mensaje que quieres codificar:\n')
    binario ="".join(f"{ord(i):08b}" for i in mensaje)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido encriptado con éxito\n')
    print('El mensaje codificado es el siguiente:\n')
    print(" ".join(f"{ord(i):08b}" for i in mensaje))
 
    return binario
 
 
 
def desEncriptar(encriptado):
    bits = int(encriptado,2)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido desencriptado con éxito\n')
    print('El mensaje descodificado es el siguiente:\n')
 
    print(bits.to_bytes((bits.bit_length() + 7) // 8, 'big').decode())
 
 
 
def menu():
 
    while True: #el bucle es para no llamar en cada opción a la función
 
        print('_______________________________________________')
 
        print('\t\t BIENVENIDO AL FORMATEADOR DE MENSAJES\n')
 
        opcion=int(input('Elige un opción\n\n1.Encriptar mensaje\n2.Desencriptar mensaje\n3.Salir\n'))
 
        if opcion==1: #como en todos los otros casos los paréntesis no son necesarios
 
            obtener=encriptar()
 
 
        elif opcion==2:
            print(obtener)
            desEncriptar(obtener)
 
 
        elif opcion == 3         #agregué la opción tres:
            print("Programa terminado")
            break  #chau script
        else:
 
            print('La opción no está disponible')
 
 
menu()

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de zer0x10
Val: 425
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

ValueError: invalid literal for int() with base 2: " "

Publicado por zer0x10 (109 intervenciones) el 17/11/2019 02:27:16
Hola, el problema que tienes es que la variable obtener, en la cual guardas el mensaje "encriptado" , y luego llamas nuevamente a la función menu, lo cual provoca que todo valor almacenando dentro de cualquier variable local a la función se pierda. En primer lugar esta mal pensado, el menu, es decir, no es necesario llamar al función cada vez luego de cada opción si no que puedes utilizar una estructura while. Además la variable texto dentro de la función desEncriptar no es necesaria ya que recibes el valor encriptado como parámetro, y esto lo que genera es que se vuelva a encriptar el parámetro, dando posteriormente el error "ValueError: invalid literal for int() with base 2: " "".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def encriptar():
    mensaje=input('Digita el mensaje que quieres codificar:\n')
    binario ="".join(f"{ord(i):08b}" for i in mensaje)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido encriptado con éxito\n')
    print('El mensaje codificado es el siguiente:\n')
    print(" ".join(f"{ord(i):08b}" for i in mensaje))
    return binario
 
def desEncriptar(encriptado):
    bits = int(encriptado,2)
    print('\t\t\t\t\t✔')
    print('Tu mensaje ha sido desencriptado con éxito\n')
    print('El mensaje descodificado es el siguiente:\n')
    print(bits.to_bytes((bits.bit_length() + 7) // 8, 'big').decode())
 
def menu():
    obtener = ''
    while True:
        print('_______________________________________________')
        print('\t\t BIENVENIDO AL FORMATEADOR DE MENSAJES\n')
        opcion=int(input('Elige un opción\n\n1.Encriptar mensaje\n2.Desencriptar mensaje\n3.Salir\n'))
        if(opcion==1):
          obtener=encriptar()
        elif(opcion==2):
          desEncriptar(obtener)
        elif(opcion==3):
           break
        else:
          print('La opción no está disponible')
menu()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar