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欺骗? 做什么事首先要问个为什么, ...
随机推荐
- AspNetPager分页控件的使用以及常见错误
原文发布时间为:2009-05-25 -- 来源于本人的百度文章 [由搬家工具导入] 【Repeater采用AspNetPager分页成功↓】 using System;using System.Co ...
- c language compile process.
- 模仿原生淘宝app点击搜索时的页面滑动效果
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- luogu 1258 小车问题 小学奥数(?)
题目链接 题意 甲.乙两人同时从A地出发要尽快同时赶到B地.出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人.已知甲.乙两人的步行速度一样,且小于车的速度.问:怎样利用小车才能使两人尽快同时到 ...
- struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t; ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---41
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- LeetCode OJ-- Text Justification
https://oj.leetcode.com/problems/text-justification/ 细节题 class Solution { public: vector<string&g ...
- 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调
前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话说,打败你的不是天真,是天真热!
- Network | 802.1x
IEEE 802.1X是IEEE制定关于用户接入网络的认证标准(注意:此处X是大写),全称是“基于端口的网络接入控制”,属于IEEE 802.1网络协议组的一部分.于2001年标准化,之后为了配合无线 ...
- 分享Kali Linux 2017.1镜像
分享Kali Linux 2017.1镜像 Kali Linux官方于4月24日发布Kali Linux 2017.1版本.该版本仍然采用滚动更新方式,所以软件源为kali-rolling.至现在分 ...