Convertendo binário para decimal vice-versa

Iniciado por adalberto, Março 04, 2017, 04:30:36 PM

tópico anterior - próximo tópico

adalberto

Dando uma relembrada sobre a base 2 usada pelo processador, resolvi fazer um código para conversão de base 2
para base 10, e para letras e strings também. Talvez seja útil em algum programa.

Segue o código:


local string_corte, emnumero, emstring = string.corte,convnumero,convstring;
funcao bin_para_dec(b)
  local b = emstring(b);
  se nao b entao retorne nulo fim;
  local valor = 0;
  local cont=0;
  para i = #b, 1, -1 inicio   
    local c = string_corte(b,i,i);
    local n = emnumero(c);
    valor = valor + ( n * (2^cont) );
    cont = cont + 1;
  fim
  retorne valor; 
fim

//imprima( bin_para_dec(101)  );

funcao dec_para_bin(d)
  se tipo(d) <> 'numero' entao
    retorne nulo;
  fim
  local mat_corte = mat.corte; //dentro de loops é aconselhável usar variáveis locais
                               //para mais rapidez;
  local result,resto,valor = 0,0,'';
  local tmp = d;
  enquanto result <> 1 inicio
    result = mat.corte(tmp/2);//tirando a parte fracionaria com o mat.corte
    resto = tmp%2;
    tmp = result;
    valor = resto .. valor
  fim
  valor = 1 .. valor;//o ultimo 1 tem de colocar agora pois o laço é interrompido nele.
  retorne valor; 
fim



funcao letra_para_bin(l)
  local asc = string.cod(l);
  local bin = dec_para_bin(asc);
  local valor = string.formate("%08d",bin);
  retorne (valor);
fim

funcao bin_para_letra(bin)
  local c = bin_para_dec(bin);
  retorne string.car(c);
fim



funcao str_para_bin(str)
  local valor,c = '';
  para i=1,#str inicio
    valor = valor .. letra_para_bin(str:corte(i,i));
  fim 
  retorne valor;
fim

funcao bin_para_str(bin)
  se nao bin entao retorne nulo fim;
  local bin = convstring(bin);
  local comeco,valor = 1,'';
  local final = comeco + 7;
  local tmp = '';
  enquanto final <= #bin inicio
    tmp = bin:corte(comeco,final);
    valor = valor .. bin_para_letra(tmp);
    comeco = final + 1;
    final = comeco + 7;
  fim
  retorne valor;
fim

imprima('5 em binario:', dec_para_bin(5) );
imprima('\n10111 em decimal:', bin_para_dec(10111));

imprima('\n"A" em binário:',letra_para_bin('A'));
imprima('\n"01000001" em letra:', bin_para_letra(01000001) );
frase = 'Prisma - linguagem de programação'
bin = str_para_bin(frase);
imprima('\n"' .. frase .. '"', 'em binario:\n\n' .. bin ,'\n\n');
imprima('Binário acima em string: ' .. bin_para_str(bin));


Desafio:

Decodifique essa mensagem em binário e poste abaixo nas respostas:


01001111001000000111001001100001011101000110111100100000011100100110111101100101011101010010000001100001001000000111001001101111011101010111000001100001001000000110010001101111001000000111001001100101011010010010000001100100011001010010000001010010011011110110110101100001

Valeu, pessoal, até mais.


rafael

Não consegui achar o erro do bin_para_str mas fiz uma gambiarra e deu certo:

O rato roeu a roupa do rei de Roma


mensagem = '01001111001000000111001001100001011101000110111100100000011100100110111101100101011101010010000001100001001000000111001001101111011101010111000001100001001000000110010001101111001000000111001001100101011010010010000001100100011001010010000001010010011011110110110101100001'
letr = {}
conta = 0
ini=1
fin=8
enquanto 1 inicio
conta = conta + 1
tam = mensagem:corte(ini,fin)
tam = #tam
se tam < 8 entao quebre fim
letr[conta] = mensagem:corte(ini,fin)
ini = ini + 8
fin = fin + 8
fim
para i = 1, #letr inicio
es.escreva(bin_para_letra(letr[i]))
es.esvazie()
fim

adalberto

Qual mensagem de erro aparece?

Aqui deu certo, fiz assim:


desafio='01001111001000000111001001100001011101000110111100100000011100100110111101100101011101010010000001100001001000000111001001101111011101010111000001100001001000000110010001101111001000000111001001100101011010010010000001100100011001010010000001010010011011110110110101100001';
imprima("Desafio:", bin_para_str(desafio));


O resultado em anexo:




rafael

Agora percebi o erro:
Estava como número e não cadeia

desafio=(01001111001000000111001001100001011101000110111100100000011100100110111101100101011101010010000001100001001000000111001001101111011101010111000001100001001000000110010001101111001000000111001001100101011010010010000001100100011001010010000001010010011011110110110101100001)
imprima("Desafio:", bin_para_str(desafio));



prisma: imprima.prisma:10: atencao para operacao aritmetica com local 'n' (um valor nulo)
Rastro da pilha:
   imprima.prisma:10: em funcao 'bin_para_dec'
   imprima.prisma:46: em funcao 'bin_para_letra'
   imprima.prisma:68: em funcao 'bin_para_str'
   imprima.prisma:85: em trecho principal
   [C]: em ?


------------------
(program exited with code: 1)
Press return to continue