Skip to content

Instantly share code, notes, and snippets.

@robertol
Created August 10, 2017 11:13
Show Gist options
  • Save robertol/d81930a17eabba2af1d5eb6a15dd624e to your computer and use it in GitHub Desktop.
Save robertol/d81930a17eabba2af1d5eb6a15dd624e to your computer and use it in GitHub Desktop.
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