Comunidad Software Libre Puebla

Se Libre, piensa libre


Blog

Taller Redes de área local

Convertir binario a ASCII y viceversa

En el evento que organizamos el pasado 13 de Febrero de 2016, propusimos a los asistentes que descifraran el siguiente mensaje escrito en binario

1001001 0100000 1001100 1001111 1010110 1000101 0100000 1000110 1010010 1000101 1000101 0100000 1010011 1001111 1000110 1010100 1010111 1000001 1010010 1000101

Aquí les pongo dos programas, uno en Ruby y otro en Python que convierten de binario a ASCII, leen un archivo de texto que contiene un número binario por línea

Archivo llamado prueba.txt
1001001
0100000
1001100
1001111
1010110
1000101
0100000
1000110
1010010
1000101
1000101
0100000
1010011
1001111
1000110
1010100
1010111
1000001
1010010
1000101

Programa en ruby llamado c_binario.rb

# Define los valores para cada uno de los bits cuando están prendidos
valor_bits = {1 => 1, 2 => 2, 3 => 4, 4 => 8, 5 => 16, 6 => 32, 7 => 64}
cadena = ""

File.open("prueba.txt") do |archivo|
   archivo.each do |linea|
      suma = 0
      # lee cada línea de derecha a izquierda, es decir, empezando por el último caracter
      # así que el primer caracter ahora es el caracter que indica el fin de la línea
      # y es la posición cero. Por lo tanto, la posición uno corresponde al bit menos
      # significativo de nuestro número binario de 7 bits y la posición 7 al bit
      # más significativo      
      linea.reverse.each_char.with_index do |caracter, posicion|
         if caracter == "1"
            suma += valor_bits[posicion]
         end
      end
      # Si el código ASCII obtenido es mayor a cero
      # Va almacenando en la variable cadena, el caracter correspondiente al código ASCII obtenido
      # Ya que al código ASCII cero le corresponde el caracter null
      if suma>0
         cadena += suma.chr
         print "#{suma} "
      end
   end
   puts "\n#{cadena}"
end

Programa en python llamado c_binario.py

# Define los valores para cada uno de los bits cuando estan prendidos
valor_bits = {1: 1, 2: 2, 3: 4, 4: 8, 5: 16, 6: 32, 7: 64}
cadena = ""

with open("prueba.txt", "r") as archivo:
   for linea in archivo:
      suma = 0
      # lee cada linea de derecha a izquierda, es decir, empezando por el ultimo caracter
      # asi que el primer caracter ahora es el caracter que indica el fin de la linea
      # y es la posicion cero. Por lo tanto, la posicion uno corresponde al bit menos
      # significativo de nuestro numero binario de 7 bits y la posicion 7 al bit
      # mss significativo
      linea = linea[::-1]
      for posicion in range(len(linea)):
          if linea[posicion] == '1':
             suma += valor_bits[posicion]
      # Si el codigo ASCII obtenido es mayor a cero
      # Va almacenando en la variable cadena, el caracter correspondiente al codigo ASCII obtenido
      # Ya que al codigo ASCII cero le corresponde el caracter null
      if suma>0:
         cadena += chr(suma)
         print suma,
   print
   print cadena

Ahora, un programa en Ruby y otro en Python que convierten de ASCII a binario, leen un archivo de texto que contiene una sola línea con el texto que se quiere convertir a binario, el texto sólo debe incluir caracteres que se encuentran en la tabla del código ASCII (eso deja fuera caracteres como vocales con acento y otros caracteres que pertenecen a la tabla del código ASCII extendido)

Archivo llamado prueba2.txt
Mi texto

Programa en ruby llamado c_ascii.rb

# Define los valores para cada uno de los bits cuando están prendidos
valor_bits = [64,32,16,8,4,2,1]
cadena = ""

File.open("prueba2.txt") do |archivo|
   archivo.each do |linea|
      puts "#{linea}"
      linea.each_char do |caracter|
         codigo = caracter.ord
         # No toma en cuenta el caracter que indica el salto de linea (LF)
         # cuyo código ASCII es 10
         if codigo != 10
            suma = 0
            print "#{codigo} "
            valor_bits.each do |decimal|
               if suma+decimal <= codigo
                  cadena += "1"
                  suma += decimal
               else
                   cadena += "0"
               end
            end
            cadena += " "
         end
      end
   end
   puts "\n#{cadena}"
end

Programa en python llamado c_ascii.py

# Define los valores para cada uno de los bits cuando estan prendidos
valor_bits = [64,32,16,8,4,2,1]
cadena = ""

with open("prueba2.txt", "r") as archivo:
   for linea in archivo:
      print linea
      for posicion in range(len(linea)):
          codigo = ord(linea[posicion])
          # No toma en cuenta el caracter que indica el salto de linea (LF)
          # cuyo codigo ASCII es 10
          if codigo != 10:
             suma = 0
             print codigo,
             for decimal in valor_bits:
                if suma+decimal <= codigo:
                   cadena += "1"
                   suma += decimal
                else:
                    cadena += "0"
             cadena += " "
   print cadena

Copyright © 2017, Todos lo Derechos reservados . Designed & Develop by Software Libre Puebla