在程序中,难免用的二进制和十进制之间的转换。遇到一个场景,通过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和子网掩码,计算地址范围 【二进制和十进制的转换】的更多相关文章

  1. 报错:vmnet8设置中出现错误。子网IP和子网掩码不一致

    报错:vmnet8设置中出现错误.子网IP和子网掩码不一致 设置子网IP时报错,如下图 同样的,写成192.168.0.0就没问题,如下图 总结: 这个虚拟网络编辑器是给添加网卡的,你添加vmnet8 ...

  2. IP地址子网掩码主机地址网络号主机号

    (1)子网掩码1所对应的位为网络号位 而所对应的位为主机号位 IP地址+子网掩码=网络号: IP地址+子网掩码(反码)=主机号. (2)主机号中的m位被用来表示网络号了,也就是子网号,将0-255划分 ...

  3. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  4. IP地址,子网掩码,默认网关,路由,形象生动阐述

    自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...

  5. [转]IP地址-子网掩码-默认网关

    IP地址:是给每个连接在Internet上的主机分配的一个32bit地址.地址有两部分组成,一部分为网络地址,另一部分为主机地址.IP地址分为A.B.C.D.E 5类.常用的是B和C两类.网络地址的位 ...

  6. IP地址 子网掩码 默认网关 DNS(转)

    突然被问到IP地址方面的知识,吓得我赶紧上网找一找资料,觉得这篇还是写得简单易懂,share一下. Key: 1.IP地址=网络地址+主机地址,(又称:主机号和网络号组成): 2.将IP地址和子网掩码 ...

  7. IP与子网掩码

    一.IP地址 1.IP:在网络中,为了实现不同计算机之间的通信,每台计算机都必须有一个唯一的地址. 2.IP地址的表示 ①IP地址是一个32位的二进制数,通常以两种方式呈现:二进制和十进制. ②二进制 ...

  8. 重拾IP路由选择:CCNA学习指南中的IP路由选择

    IP路由选择技术 是网络技术的核心部分,也是目前研究的热点,其中的 动态路由选择协议 比如RIPv1,RIPv2,OSPF等,解决了数据在网络中转递的诸多问题. 在TCP/IP协议详解的学习过程中,我 ...

  9. LoadRunner中的IP欺骗的设置以及误区

    LoadRunner中的IP欺骗的设置以及误区 最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么, ...

随机推荐

  1. div模拟dropdownlist控件 div下拉菜单

    原文发布时间为:2009-10-16 -- 来源于本人的百度文章 [由搬家工具导入] 控件发布:div2dropdownlist(div模拟dropdownlist控件) div3dropdownli ...

  2. android的布局-----GridLayout(网格布局)

    学习导图 (一)简介 网格布局由GridLayout所代表,在android4.0之后新增加的布局管理器,因此需要android4.0之后的版本中使用,如果在更早的平台使用该布局管理器,则需要导入相应 ...

  3. 在 Fedora 26/27 GNOME 3.24/3.26 环境中安装 FCITX 小企鹅输入法(修订)

    之前我曾经写过一篇文章介绍在 GNOME 3.x 下安装小企鹅输入法框架,但最近在 Fedora 26/27 环境下发现老方法已经失效了,会导致 GNOME 3.24/3.26 桌面在重启后无法进入, ...

  4. DOM和jquery对象之间的转换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. hdu 5685(逆元)

    Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. Django ModelChoiceField前台下拉菜单显示object的解决方法

    在网上找了好半天都没找到,在model中添加即可,不加的话显示就是object def __str__(self): return self.name

  7. HTTP 状态消息 [转]

    转自:https://www.cnblogs.com/wuyongyu/p/5745875.html    HTTP 状态消息                                     ...

  8. iOS github大全 & iOS7的学习blog

    iOS github大全 :有600多个iOS各方面的开源库,并分类了 一天天学习iOS7 :每天学习一点iOS7的新特性

  9. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  10. 爬虫:网页里元素的xpath结构,scrapy不一定就找的到

    这种情况原因是html界面关联的js文件可能会动态修改DOM结构,这样浏览器完成了动态修改DOM,在 浏览器上看到的DOM结构,就和后台抓到的DOM结构不通 举例:新浪微博发的微博,在浏览器通过fir ...