Mac加减法,Mac地址加1,Mac地址减1
之前我写过一篇Mac地址加减1换算的文章,里面有些不太全面,这里我重新出一片博客来解释一下。
Mac的真实地址应该是:ADCF4D5FD3CF,这种,而不是AD:CF:4D:5F:D3:CF,这种是人为的加冒号,为了看起来方便吧;
那Mac地址怎么加减1呢?其实说白了Mac地址既然是ADCF4D5FD3CF这种格式的,那么它就是个16进制的数了,所以把它转换成10进制的,然后对它加减不就行了?理论上没问题,一般人呢是这么来把16进制转换为10进制的:
int tenFormat = Integer.parseInt("ADCF4D5FD3CF", 16);那么我们可以试一试,这样子肯定会错误的(java.lang.NumberFormatException),我们看到的Mac是12位,那么int能存几位?
各位看官,我们想想还有什么可以存这么多,嗯,你想的没错是Long型,我们来试试:
Long.toHexString(Long.parseLong(mac, 16) + add).toUpperCase(Locale.getDefault());唉,对了,没错了,这样就对了,所以正确的Mac地址的加减法应该是这样的:
/** * Mac加法 * @author YOLANDA * @param mac Mac地址,eg:ABCDEF56BFD0 * @param add 要加的数 * @return */ public static String getMacAdd(String mac, int add) { return Long.toHexString(Long.parseLong(mac, 16) + add).toUpperCase(Locale.getDefault()); } /** * Mac减法 * @author YOLANDA * @param mac Mac地址:eg:ABCDEF56BFD0 * @param minus 要减的数 * @return */ public static String getMacMinus(String mac, int minus){ return Long.toHexString(Long.parseLong(mac, 16) - minus).toUpperCase(Locale.getDefault()); }
这里有几点要注意:
1、我遇到的一般都是Mac加减1的需求吧,所以这里最好对传进来加减的数字做个判断,要做限制
2、还有有的Mac换算只是最后一位加减1,那么这样的怎么来算呢?
其实对于第二种要比第一种要复杂一点,怎么说呢?因为不能直接换算。这里来说说思路:
我们首先要把最后一位拿出来,把它转为10进制的数,然后对它加减1,再把它转为16进制的字符,和之前的11位拼接起来,那么如果最后一位是0或者F呢?这样想想是不是有点小复杂呢?
那么我们首先要想到16进制是怎样排列的,它含有字母,不是十进制0123456789,而是0123456789ABCDEF这样的16位,我们明白了这一点就知道如何加减了吧,下面直接来提供算法:
/** * Mac尾数加法 * @author YOLANDA * @param mac Mac地址:CAFDEFB469DF * @param add 要加的数 * @return 返回为数加 减后的Mac地址 */ public static String getMacAdd(String mac, int add){ String lastChar = mac.substring(mac.length() - 1).toUpperCase(Locale.getDefault()); mac = mac.substring(0, mac.length() - 1); if("F".equals(lastChar)){ lastChar = "0"; } else { int tempChar = Integer.parseInt(lastChar, 16) + add; lastChar = Integer.toHexString(tempChar).toUpperCase(Locale.getDefault()); } return (mac + lastChar); } /** * Mac尾数减法 * @author YOLANDA * @param mac Mac地址:CAFDEFB469DF * @param minus 要减的数 * @return 返回为数加 减后的Mac地址 */ public static String getMacMinus(String mac, int minus){ String lastChar = mac.substring(mac.length() - 1).toUpperCase(Locale.getDefault()); mac = mac.substring(0, mac.length() - 1); if("0".equals(lastChar)){ lastChar = "F"; } else { int tempChar = Integer.parseInt(lastChar, 16) - minus; lastChar = Integer.toHexString(tempChar).toUpperCase(Locale.getDefault()); } return (mac + lastChar); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。