Created
August 10, 2017 11:13
-
-
Save robertol/d81930a17eabba2af1d5eb6a15dd624e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
funcao NumParaBits(num, bits) | |
local resto_div = mat.cmodulo //cadeia local para mais agilidade | |
local tabela_insira = tabela.insira | |
local t={} /** Como o laço será contado de trás pra frente a tabela também */ | |
para b=bits,1,-1 inicio /** Conte até um de um por um começando da quantidade de bits */ | |
resto=resto_div(num,2) /** Retorna o resto da divisão de num por 2 */ | |
tabela_insira(t,1,resto) /** Números pares por 2 resto 0, ímpares resto 1 */ | |
num=(num-resto)/2 /** Tornano o número par em direção a 0 */ | |
fim | |
se num==0 entao /** Se não chegar a 0 então não deu pra terminar o laço */ | |
retorne tabela.concat(t) | |
senao retorne | |
'Não há bits suficientes para representar este número' | |
fim | |
fim | |
resultado=NumParaBits(255, 8) | |
imprima(resultado) | |
funcao OctetoParaIP(R) | |
se #R < 33 entao | |
a = R:corte(1,8) | |
b = R:corte(9,16) | |
c = R:corte(17,24) | |
d = R:corte(25,32) | |
retorne {bin_para_dec(a),bin_para_dec(b),bin_para_dec(c),bin_para_dec(d)} | |
senao | |
retorne {'Precisa de 32 bits'} | |
fim | |
fim | |
funcao CalculadoraIPv4(R) // tem que estar no formato 10.10.10.0/255.255.255.0 | |
se R entao | |
local mensagem = "O endereço deve estar no formato: 10.10.10.10/24 ou 10.10.10.10/255.255.255.0" | |
local resto_div = mat.cmodulo | |
local F = R:analise("./") | |
n1 = F[1] se n1 entao n1 = convnumero(n1) fim | |
n2 = F[3] se n2 entao n2 = convnumero(n2) fim | |
n3 = F[5] se n3 entao n3 = convnumero(n3) fim | |
n4 = F[7] se n4 entao n4 = convnumero(n4) fim | |
n5 = F[9] se n5 entao n5 = convnumero(n5) fim | |
n6 = F[11] se n6 entao n6 = convnumero(n6) fim | |
n7 = F[13] se n7 entao n7 = convnumero(n7) fim | |
n8 = F[15] se n8 entao n8 = convnumero(n8) fim | |
se F[8] <> '/' | |
entao | |
imprima(mensagem) | |
senao | |
se n5 e n6 e n7 e n8 entao | |
MascaraBin = (NumParaBits(n5,8)..NumParaBits(n6,8)..NumParaBits(n7,8)..NumParaBits(n8,8)) | |
TabMasc = MascaraBin:analise("01") | |
Bits = MascaraBin:troque("0","") | |
para i=1,32 inicio | |
se TabMasc[i] == "0" entao quebre fim | |
Masc = i | |
fim | |
se #Bits <> Masc entao imprima("Máscara incorreta") | |
senao | |
se n5 < 256 e n6 < 256 e n7 < 256 e n8 < 256 | |
entao | |
Endereco = (n1.."."..n2.."."..n3.."."..n4) | |
Mascara = (n5.."."..n6.."."..n7.."."..n8) | |
EnderecoBin = (NumParaBits(n1,8)..NumParaBits(n2,8)..NumParaBits(n3,8)..NumParaBits(n4,8)) | |
ZerosDoFinal = MascaraBin:troque("1","") | |
UnsDoFinal = ZerosDoFinal:troque("0","1") | |
QuantIPs = 2 ^ #UnsDoFinal -2 | |
se QuantIPs <= 0 entao QuantIPs = 1 fim | |
Prefixo = EnderecoBin:corte(1,#Bits) | |
Sufixo = EnderecoBin:corte(#Bits+1, 32) | |
EnderecoDaRedeBin = Prefixo..ZerosDoFinal | |
EnderecoDeTransmissaoBin = Prefixo..UnsDoFinal | |
EnderecoDaRede = tabela.concat(OctetoParaIP(EnderecoDaRedeBin),".") | |
EnderecoDeTransmissao = tabela.concat(OctetoParaIP(EnderecoDeTransmissaoBin),".") | |
Pi = OctetoParaIP(EnderecoDaRedeBin) | |
PrimeiroIP = (Pi[1].."."..Pi[2].."."..Pi[3].."."..Pi[4]+1) | |
Ui = OctetoParaIP(EnderecoDeTransmissaoBin) | |
UltimoIP = (Ui[1].."."..Ui[2].."."..Ui[3].."."..Ui[4]-1) | |
se Masc == 32 entao PrimeiroIP = Endereco | |
UltimoIP = Endereco | |
senaose Masc == 31 entao PrimeiroIP = Endereco | |
UltimoIP = (Ui[1].."."..Ui[2].."."..Ui[3].."."..Ui[4]) | |
fim | |
imprima( | |
"\n Endereço: "..EnderecoBin, Endereco.. | |
"\n Máscara: "..MascaraBin, Mascara.. | |
"\n End Rede: "..EnderecoDaRedeBin, EnderecoDaRede.. | |
"\n Transm: "..EnderecoDeTransmissaoBin, EnderecoDeTransmissao.. | |
"\n PrimeiroIP: "..PrimeiroIP.. | |
"\n ÚltimoIP: "..UltimoIP.. | |
"\n Quant.IPs: "..QuantIPs | |
) | |
senao | |
imprima(mensagem) | |
fim | |
fim | |
senao | |
se n5 < 33 entao | |
t={} | |
para i=1, n5 inicio t[i]=1 fim | |
r = 32 - n5 | |
se r <> 0 entao para i=1,r inicio m=(#t+1) t[m]='0' fim fim | |
MascaraBin = tabela.concat(t) | |
ZerosDoFinal = MascaraBin:corte(n5+1, 32) | |
UnsDoFinal = ZerosDoFinal:troque("0","1") | |
QuantIPs = 2^r-2 | |
se QuantIPs <= 0 entao QuantIPs = 1 fim | |
EnderecoBin = (NumParaBits(n1,8)..NumParaBits(n2,8)..NumParaBits(n3,8)..NumParaBits(n4,8)) | |
Prefixo = EnderecoBin:corte(1,n5) | |
Sufixo = EnderecoBin:corte(n5+1, 32) | |
EnderecoDaRedeBin = Prefixo..ZerosDoFinal | |
EnderecoDeTransmissaoBin = Prefixo..UnsDoFinal | |
Endereco = tabela.concat(OctetoParaIP(EnderecoBin),".") | |
Mascara = tabela.concat(OctetoParaIP(MascaraBin),".") | |
EnderecoDaRede = tabela.concat(OctetoParaIP(EnderecoDaRedeBin),".") | |
EnderecoDeTransmissao = tabela.concat(OctetoParaIP(EnderecoDeTransmissaoBin),".") | |
Pi = OctetoParaIP(EnderecoDaRedeBin) | |
PrimeiroIP = (Pi[1].."."..Pi[2].."."..Pi[3].."."..Pi[4]+1) | |
Ui = OctetoParaIP(EnderecoDeTransmissaoBin) | |
UltimoIP = (Ui[1].."."..Ui[2].."."..Ui[3].."."..Ui[4]-1) | |
se n5 == 32 entao PrimeiroIP = Endereco | |
UltimoIP = Endereco | |
senaose n5 == 31 entao PrimeiroIP = Endereco | |
UltimoIP = (Ui[1].."."..Ui[2].."."..Ui[3].."."..Ui[4]) | |
fim | |
imprima( | |
"\n Endereço: "..EnderecoBin, Endereco.. | |
"\n Máscara: "..MascaraBin, Mascara .. | |
"\n End Rede: "..EnderecoDaRedeBin, EnderecoDaRede.. | |
"\n Transm: "..EnderecoDeTransmissaoBin, EnderecoDeTransmissao.. | |
"\n PrimeiroIP: "..PrimeiroIP.. | |
"\n ÚltimoIP: "..UltimoIP.. | |
"\n Quant.IPs: "..QuantIPs | |
) | |
senao | |
imprima(mensagem) | |
fim | |
fim | |
fim | |
senao | |
imprima(mensagem) | |
fim | |
fim | |
CalculadoraIPv4("8.8.8.8/255.255.255.0") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment