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