erlang中通过ip和子网掩码,计算地址范围 【二进制和十进制的转换】
在程序中,难免用的二进制和十进制之间的转换。遇到一个场景,通过ip和子网掩码,计算地址范围。
而地址范围为:网络地址+1—— 广播地址 -1 . 网络地址即ip和子网掩码的与的位运算。广播地址为:网络地址的主机位全部换成1。
打个比方:
IP为: 192.168.0.0 /16 ,这里,/16表示前16为是网络位,后16位是主机位。
子网掩码为:255.255.255.0/24,这里,/24表示前24位是网络位,后8位是主机位。
要求得:地址范围,首先就需求出网络地址和广播地址。进而涉及到二进制和十进制之间的转换。
十进制转二进制,erlang有BIF内置函数,integer_to_list(X,Y),
举个栗子:在erlang的shell下,
> erlang:integer_to_list(255,2),
> 11111111
出来的二进制为8个1。当然,还有函数实现的。
而二进制转换为十进制中, 在erlang的shell下,
>2#11111111,输出结果为255.
erlang没有直接调用二进制转换十进制的函数接口。于是,自己封装一个,如下:
% 2进制转换10进制
testbin(X) ->
A = integer_to_list(X div 10),
B = X rem 10,
erlang:trunc(bin2de(A)) + B. bin2de([]) -> 0;
bin2de(A) ->
{L1,L2} = lists:split(1,A),
case list_to_integer(L1) of
1 -> math:pow(2,length(A)) + bin2de(L2);
0 -> bin2de(L2)
end.
思路很简单,就是除以10,取商和余数,分别做2的阶乘,最后再相加即可.
测试结果如图:

用2#数值,在shell下验证,结果一样的.
附代码如下:
-module(ip). -compile(export_all). test() ->
%% 读配置文件
% {} = file:consult(),
[A,B,C,D] = [192,4,0,1],
[A1,B1,C1,D1] = [255,255,255,0],
%%计算网络地址
IP1 = [A,B,C,D],
IP2 = [A1,B1,C1,D1],
NetAddress = [A band A1, B band B1, C band C1, D band D1],
io:format("NetAddress.....~p~n",[NetAddress]), %%网络地址的十进制
% Netaddressbin = lists:map(fun(X) -> de2bin(X,[]) end, NetAddress),
% io:format("Naddressbin.....~p~n",[Netaddressbin]), %%网络地址的二进制 %%网络地址的二进制
Netaddressbin1 = lists:map(fun(X) ->
case length(integer_to_list(X,2)) of
8 -> integer_to_list(X,2);
7 -> "0" ++ integer_to_list(X,2);
6 -> "00" ++ integer_to_list(X,2);
5 -> "000" ++ integer_to_list(X,2);
4 -> "0000" ++ integer_to_list(X,2);
3 -> "00000" ++ integer_to_list(X,2);
2-> "000000" ++ integer_to_list(X,2);
1 -> "0000000" ++ integer_to_list(X,2)
end
end, NetAddress),
io:format("Naddressbin1.....~p~n",[Netaddressbin1]), % 计算广播地址(广播地址是网络地址的主机位全部换成1后, 在减去1)
% BroadcastAddress =
IP1bin = lists:map(fun(X) -> integer_to_list(X,2) end, IP1),
io:format("IP1bin.....~p~n",[IP1bin]), IP2bin = lists:map(fun(X) -> integer_to_list(X,2) end, IP2),
io:format("IP2bin.....~p~n",[IP2bin]). % 2进制转换10进制
testbin(X) ->
A = integer_to_list(X div 10),
B = X rem 10,
erlang:trunc(bin2de(A)) + B. bin2de([]) -> 0;
bin2de(A) ->
{L1,L2} = lists:split(1,A),
case list_to_integer(L1) of
1 -> math:pow(2,length(A)) + bin2de(L2);
0 -> bin2de(L2)
end. % 10进制转换2进制
de2bin(0,Acc) -> Acc;
de2bin(N,Acc) ->
de2bin(N bsr 1,[((N band 1)+$0)|Acc]). tempData([0])-> [];
tempData([Num]) ->
Result = Num band 1,
integer_to_list(Result) ++ tempData([Num bsr 1]). de2Binary(Num)->
BinaryList = lists:reverse(tempData([Num])),
LoopTimes = length(BinaryList) rem 8,
if LoopTimes > 0 -> addBlank(BinaryList,8 - LoopTimes);
true -> BinaryList
end. addBlank(BinaryList,0) -> BinaryList;
addBlank(BinaryList,Times) ->
addBlank("0" ++ BinaryList,Times-1).
erlang中通过ip和子网掩码,计算地址范围 【二进制和十进制的转换】的更多相关文章
- 报错:vmnet8设置中出现错误。子网IP和子网掩码不一致
报错:vmnet8设置中出现错误.子网IP和子网掩码不一致 设置子网IP时报错,如下图 同样的,写成192.168.0.0就没问题,如下图 总结: 这个虚拟网络编辑器是给添加网卡的,你添加vmnet8 ...
- IP地址子网掩码主机地址网络号主机号
(1)子网掩码1所对应的位为网络号位 而所对应的位为主机号位 IP地址+子网掩码=网络号: IP地址+子网掩码(反码)=主机号. (2)主机号中的m位被用来表示网络号了,也就是子网号,将0-255划分 ...
- 获得Unix/Linux系统中的IP、MAC地址等信息
获得Unix/Linux系统中的IP.MAC地址等信息 中高级 | 2010-07-13 16:03 | 分类:①C语言. Unix/Linux. 网络编程 ②手册 | 4,471 次阅读 ...
- IP地址,子网掩码,默认网关,路由,形象生动阐述
自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...
- [转]IP地址-子网掩码-默认网关
IP地址:是给每个连接在Internet上的主机分配的一个32bit地址.地址有两部分组成,一部分为网络地址,另一部分为主机地址.IP地址分为A.B.C.D.E 5类.常用的是B和C两类.网络地址的位 ...
- IP地址 子网掩码 默认网关 DNS(转)
突然被问到IP地址方面的知识,吓得我赶紧上网找一找资料,觉得这篇还是写得简单易懂,share一下. Key: 1.IP地址=网络地址+主机地址,(又称:主机号和网络号组成): 2.将IP地址和子网掩码 ...
- IP与子网掩码
一.IP地址 1.IP:在网络中,为了实现不同计算机之间的通信,每台计算机都必须有一个唯一的地址. 2.IP地址的表示 ①IP地址是一个32位的二进制数,通常以两种方式呈现:二进制和十进制. ②二进制 ...
- 重拾IP路由选择:CCNA学习指南中的IP路由选择
IP路由选择技术 是网络技术的核心部分,也是目前研究的热点,其中的 动态路由选择协议 比如RIPv1,RIPv2,OSPF等,解决了数据在网络中转递的诸多问题. 在TCP/IP协议详解的学习过程中,我 ...
- LoadRunner中的IP欺骗的设置以及误区
LoadRunner中的IP欺骗的设置以及误区 最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么, ...
随机推荐
- Docker(一):什么是docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...
- C++中的explicit关键字(转)
按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(); ...
- shell中规则表达式与特殊符号
在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理数据就更方便了!底下我们列出一些常用的通配符喔: 符号 意义 * 代表『 0 个到无穷 ...
- 《手把手教你学C语言》学习笔记(4)---代码规范
编程过程中需要遵守编译器的各种约定,例如以下代码: 1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 print ...
- 谁都能听懂的Redux+Redux-Saga超级傻瓜教程
对不起本文确实有标题党的嫌疑:) 想要理解本文还是要先会用react和es6,如果连react和es6都不知道是什么的话我也没辙:( 如果你选择用react来开发应用,并且你没对各个组件的状态进行应有 ...
- 初探ggplot2 geom__制作面积图
大家大概都对如下信息图并不陌生,该图用100%堆积面积图的方式来表现不同时期不同国家人数所占的比例.这是一种很有意思的表达方式,而面积图也是很常用的数据图表,现在让我们一起来看看如何在R里用g ...
- 我的CSS初始化,reset.css
* { margin:; padding:; text-decoration: none; -webkit-overflow-scrolling: touch !important; /*iOS惯性滚 ...
- HTTP 代理(转)
什么是代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddle ...
- 每天学一点Python
9月11日 1.用List实现Python里的?:条件表达式 ["false","true"][判断条件] 其实就是一个List[0]还是List[1]的问题. ...
- tomcat 登录时用户名和密码问题
在编程的时候我们经常在myeclipes中直接部署web程序,大多数情况下不会登陆tomcat,这样时间长了我们就忘记了tomcat的登陆用户名和密码,下面就说一下怎么找到tomcat的用户名和密码吧 ...