在程序中,难免用的二进制和十进制之间的转换。遇到一个场景,通过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. [论文]A Link-Based Cluster Ensemble Approach for Categorical Data Clustering

    http://www.cnblogs.com/Azhu/p/4137131.html 这篇论文建议先看了上面这一遍,两篇作者是一样的,方法也一样,这一片论文与上面的不同点在于,使用的数据集是目录数据, ...

  2. poj 2280 Islands and Bridges 哈密尔顿路 状压dp

    题目链接 题意 给定一个\(N\)个点的无向图,求一条哈密尔顿路径\(C_1C_2...C_n\),使其\(value\)最大. \(value\)的计算方式如下:\[\begin{aligned}v ...

  3. 【虚拟机】主机与VMware虚拟机通信(XP版)(转)

    一.与主机共享ADSL链接/无线网络(虚拟机内可上网) 安装虚拟机后,在网络链接下除了本地链接外,会出现两个新的链接,分别是VMware Network Adapter VMnet1和VMware N ...

  4. 关于platform_device和platform_driver的匹配【转】

    转自:http://blog.csdn.net/dfysy/article/details/5959451 版权声明:本文为博主原创文章,未经博主允许不得转载. 说句老实话,我不太喜欢现在Linux ...

  5. android基本控件学习-----SeekBar&RatingBar

    SeekBar(拖动条)和RatingBar(星级评分条)讲解 一.SeekBar(拖动条) (1)拖动条简单理解就是可以拖动的线,这个对我们来讲很常见,比如视频播放或者音乐播放我们拖动播放的进度,下 ...

  6. 【linux】进程存储管理

    看<Linux高级程序设计>的笔记 设有一个hello的可执行文件 ①显示该文件的基本信息 ls hello -l ②文件基本情况 file hello ③列出文件的存储区域情况 size ...

  7. java gc --- 四种引用

    古龙有<七种武器>,java里有四种引用. 下文主要是对 <understanding-weak-references>这一博文的重点进行翻译 强引用,strong refer ...

  8. Codeforces 739B Alyona and a tree(树上路径倍增及差分)

    题目链接 Alyona and a tree 比较考验我思维的一道好题. 首先,做一遍DFS预处理出$t[i][j]$和$d[i][j]$.$t[i][j]$表示从第$i$个节点到离他第$2^{j}$ ...

  9. Fiddler简介以及web抓包

    Fiddler简介以及web抓包 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.Fiddler简介简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联 ...

  10. 语义分割丨PSPNet源码解析「训练阶段」

    引言 之前一段时间在参与语义分割的项目,最近有时间了,正好把这段时间的所学总结一下. 在代码上,语义分割的框架会比目标检测简单很多,但其中也涉及了很多细节.在这篇文章中,我以PSPNet为例,解读一下 ...