在程序中,难免用的二进制和十进制之间的转换。遇到一个场景,通过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. EBImage - - 给图片增加字符

    EBImage中文文档 英文版出处:http://www.bioconductor.org/packages/release/bioc/vignettes/EBImage/inst/doc/EBIma ...

  2. Javascript中递归的调用

    递归函数就是调用自身,如下所示: function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1 ...

  3. 【转】重装Ubuntu时如何保留/home分区中的数据

    Windows系统可以在重装时只格式化C盘,从而保留其他分区的数据. Ubuntu系统也可以,只要在安装系统时分出一个/home分区.你可以把Ubuntu的“/”分区看为Windows的C盘,重装Ub ...

  4. android 的渐变背景设置文件

    main.xml:<button android:layout_width="wrap_content" android:layout_height="wrap_c ...

  5. Codeforces Gym100971 L.Chess Match (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)

    这个题就是两个队,看最多能赢的个数,然后比较一下,看两个队是都能赢彼此,还是只有一个队赢的可能性最大.表达能力不好,意思差不多... 和田忌赛马有点像,emnnn,嗯. 代码: 1 #include& ...

  6. Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]

    https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95 取模也是一样的,就当多减几次. 在欧几里得最初的 ...

  7. Web模糊测试工具Powerfuzzer

    Web模糊测试工具Powerfuzzer   Powerfuzzer是Kali Linux自带的一款Web模糊测试工具.该工具基于各种开源模糊测试工具构建,集成了大量安全信息.该工具高度智能化,它能根 ...

  8. 【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;

    主键生成策略使用UUID报出如警告如下: 控制台- 2017-11-24 18:40:14 [restartedMain] WARN org.hibernate.id.UUIDHexGenerator ...

  9. wxWidgets 安装方法(Windows 8.1 + Visual Studio 2013)

    在windows 8.1上面,搭建基于visual studio 2013的wxWidgets的开发环境,方法如下: 下载  目前最新版本为3.0.0,下载地址: http://sourceforge ...

  10. SSD配置

    SSD: Single Shot MultiBox Detector - 运行“ make -j32”时出错: nvcc warning : The 'compute_20', 'sm_20', an ...