『IPv4アドレスのマスクの変換』投稿2

どう書く?.org』への投稿

お題:IPv4アドレスのマスクの変換

http://ja.doukaku.org/253/

以前PHPで書いたものを秀丸マクロで書く。

ようするに、255.255.255.128などのネットマスクをビット値に変換すればよい。またその逆変換も求められている。

秀丸マクロの場合、2進数⇔10進数の変換サブルーチンを用意しなければならず、その分stepがかさんでいる。

Mask2Bit:  
	##c=0;  
	##bit=0;  
	while (strlen($$1)) {  
		$b = leftstr($$1,1);  
		$$1 = rightstr($$1, strlen($$1)-1);  
		if ($b == “.”) {  
			##c = ##c + 1;  
		} else if (val($b) == 0 && $b != “0”) {  
			break;  
		} else {  
			$$aar[##c] = $$aar[##c] + $b;  
		}  
	}  
	while (0 <= ##c) {  
		call Dec2Bin val($$aar[##c]);  
		while (strlen($$return)) {  
			##bit = ##bit + val(leftstr($$return,1));  
			$$return = rightstr($$return, strlen($$return)-1);  
		}  
		##c = ##c – 1;  
	}  
	return ##bit;  
  
Bit2Mask:  
	$$b_str = “”;  
	$$mask = “”;  
	while (strlen($$b_str) < 32) {  
		if (0<##1) {  
			$$b_str = $$b_str + “1”;  
		} else {  
			$$b_str = $$b_str + “0”;  
		}  
		##1 = ##1 – 1;  
	}  
	while (strlen($$b_str)) {  
		call Bin2Dec leftstr($$b_str, 8);  
		$$mask = $$mask + str(##return);  
		$$b_str = rightstr($$b_str, strlen($$b_str)-8);  
		if (strlen($$b_str)) {  
			$$mask = $$mask + “.”;  
		}  
	}  
	return $$mask;  
  
Bin2Dec:  
	##dec = 0;  
	##val = 1;  
	while (strlen($$1)) {  
		if (rightstr($$1, 1) == “1”) {  
			##dec = ##dec + ##val;  
		}  
		##val = ##val*2;  
		$$1 = leftstr($$1, strlen($$1)-1);  
	}  
	return ##dec;  
  
Dec2Bin:  
	$$str = “”;  
	if (##1!=0) {  
		while (##1!=1) {  
			$$str = str(##1%2)+$$str;  
			##1 = ##1/2;  
		}  
		$$str = “1”+$$str;  
	} else {  
		$$str = “0”;  
	}  
	return $$str;

投稿:

http://ja.doukaku.org/comment/9444/