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);
	}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。