Notícias:

SMF - Just Installed!

Menu principal

Calculadora IPv4

Iniciado por rafael, Julho 25, 2017, 10:58:35 PM

tópico anterior - próximo tópico

rafael

Olá a todos, fiz uma calculadora de IPv4 quem quiser melhorar fique a vontade:

Usei algumas funções do Adalberto

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")


rafael

#1
Versão 2.0
imagem para quem não é registrado: http://imageshack.com/a/img922/3672/kT64h3.png

funcao ImprimaBits(a)

b=2^a-1
c=b/2
p = c/2
z="0"
u="1"
c2 = 0
c3 = 0
c4 = 0
c5 = 0
c6 = 0
c7 = 0
c8 = 0
c9 = 0
c10 = 0
c11 = 0
c12 = 0
c13 = 0
c14 = 0
c15 = 0
c16 = 0
pref = ""
t = {}

para i=0,b inicio

se c2 == 2^2 entao c2 = 0 fim
se c3 == 2^3 entao c3 = 0 fim
se c4 == 2^4 entao c4 = 0 fim
se c5 == 2^5 entao c5 = 0 fim
se c6 == 2^6 entao c6 = 0 fim
se c7 == 2^7 entao c7 = 0 fim
se c8 == 2^8 entao c8 = 0 fim
se c9 == 2^9 entao c9 = 0 fim
se c10 == 2^10 entao c10 = 0 fim
se c11 == 2^11 entao c11 = 0 fim
se c12 == 2^12 entao c12 = 0 fim
se c13 == 2^13 entao c13 = 0 fim
se c14 == 2^14 entao c14 = 0 fim
se c15 == 2^15 entao c15 = 0 fim
se c16 == 2^16 entao c16 = 0 fim

se a > 15 entao
se c16> 2^16/2-1 entao pref = pref..u fim
se c16 < 2^16/2 entao pref = pref..z fim
fim
se a > 14 entao
se c15 > 2^15/2-1 entao pref = pref..u fim
se c15 < 2^15/2 entao pref = pref..z fim
fim
se a > 13 entao
se c14 > 2^14/2-1 entao pref = pref..u fim
se c14 < 2^14/2 entao pref = pref..z fim
fim
se a > 12 entao
se c13 > 2^13/2-1 entao pref = pref..u fim
se c13 < 2^13/2 entao pref = pref..z fim
fim
se a > 11 entao
se c12 > 2^12/2-1 entao pref = pref..u fim
se c12 < 2^12/2 entao pref = pref..z fim
fim
se a > 10 entao
se c11 > 2^11/2-1 entao pref = pref..u fim
se c11 < 2^11/2 entao pref = pref..z fim
fim
se a > 9 entao
se c10 > 2^10/2-1 entao pref = pref..u fim
se c10 < 2^10/2 entao pref = pref..z fim
fim
se a > 8 entao
se c9 > 2^9/2-1 entao pref = pref..u fim
se c9 < 2^9/2 entao pref = pref..z fim
fim
se a > 7 entao
se c8 > 2^8/2-1 entao pref = pref..u fim
se c8 < 2^8/2 entao pref = pref..z fim
fim
se a > 6 entao
se c7 > 2^7/2-1 entao pref = pref..u fim
se c7 < 2^7/2 entao pref = pref..z fim
fim
se a > 5 entao
se c6 > 2^6/2-1 entao pref = pref..u fim
se c6 < 2^6/2 entao pref = pref..z fim
fim
se a > 4 entao
se c5 > 15 entao pref = pref..u fim
se c5 < 16 entao pref = pref..z fim
fim
se a > 3 entao
se c4 > 7 entao pref = pref..u fim
se c4 < 8 entao pref = pref..z fim
fim
se a > 2 entao
se c3 > 3 entao pref = pref..u fim
se c3 < 4 entao pref = pref..z fim
fim
se a > 1 entao
se c2 < 2 entao pref = pref..z fim
se c2 > 1 entao pref = pref..u  fim
fim
fin = mat.cmodulo(i,2)

pref = pref..fin
//imprima(pref)
tabela.insira(t,1,pref)
pref = ""
c2 = c2 + 1
c3 = c3 + 1
c4 = c4 + 1
c5 = c5 + 1
c6 = c6 + 1
c7 = c7 + 1
c8 = c8 + 1
c9 = c9 + 1
c10 = c10 + 1
c11 = c11 + 1
c12 = c12 + 1
c13 = c13 + 1
c14 = c14 + 1
c15 = c15 + 1
c16 = c16 + 1

fim
retorne t
fim

//----------------------------------------------------------------------
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

//-----------------------------------------------------------------------

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 MostreBlocoCalculado(R)

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("./")
local t = {}

local n1 = F[1] se n1 entao n1 = convnumero(n1) fim
local n2 = F[3] se n2 entao n2 = convnumero(n2) fim
local n3 = F[5] se n3 entao n3 = convnumero(n3) fim
local n4 = F[7] se n4 entao n4 = convnumero(n4) fim
local n5 = F[9] se n5 entao n5 = convnumero(n5) fim
local n6 = F[11] se n6 entao n6 = convnumero(n6) fim
local n7 = F[13] se n7 entao n7 = convnumero(n7) fim
local 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

local MascaraBin  = (NumParaBits(n5,8)..NumParaBits(n6,8)..NumParaBits(n7,8)..NumParaBits(n8,8))
local TabMasc = MascaraBin:analise("01")
local 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
r = Masc
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
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
local 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
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

MostreBlocoCalculado("10.0.0.0/28")

tb = ImprimaBits(r)



para i=#tb, 1, -1 inicio
J = Prefixo..tb[i]
S = OctetoParaIP(J)
Lista = (S[1].."."..S[2].."."..S[3].."."..S[4])
imprima(Lista)
fim




adalberto

Muito legal. Qual distro vc usa?

rafael

Eu uso ubuntu gnome com tema MacOS-Sierra-master e icones Numix-circle