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.
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
Qual mensagem de erro aparece?
Aqui deu certo, fiz assim:
desafio='01001111001000000111001001100001011101000110111100100000011100100110111101100101011101010010000001100001001000000111001001101111011101010111000001100001001000000110010001101111001000000111001001100101011010010010000001100100011001010010000001010010011011110110110101100001';
imprima("Desafio:", bin_para_str(desafio));
O resultado em anexo:
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