ビット演算、初めて使ったかも。
Modified EUI-64の生成方法
サンプル スクリプト
function ConvertTo-NetIPv6Eui64{
<#
.SYNOPSIS
Calculate EUI64 from MAC address.
.DESCRIPTION
EUI64 is IPv6 Interface ID.
.PARAMETER mac
Network-Card MAC address.
.EXAMPLE
c:PS>xxx.ps1 -mac "00:11:22:AA:BB:CC"
> 211:22FF:FEAA:BBCC
.EXAMPLE
c:PS>xxx.ps1 -mac "00-11-22-AA-BB-CC"
> 211:22FF:FEAA:BBCC
.INPUTS
None.
.OUTPUTS
None.
.NOTES
Author: Satoru Nasu.
.LINK
http://nasunoblog.blogspot.com/
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$True,Position=1)]
[string]$mac
)
$addMac = "FF:FE"
$delimiter = ":"
$delimiterSub = "-"
# 正規表現でMACアドレスをチェック
# [0-9A-Fa-f]{2}[:-])を{5}回繰り返し、最後に[0-9A-Fa-f]{2}[:-])
if(($mac -match "^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$") -eq $false){
return $false
}
# MACアドレスの区切り文字を:へ変換
if($mac.IndexOf($delimiterSub) -gt 0){
$mac = $mac -replace $delimiterSub, $delimiter
}
# $macを$delimiterで分割
$x = $mac -split $delimiter
# InterfaceID生成用配列
$r = $x[0..2] + ($addMac -split $delimiter) + $x[3..5]
# 16進数→10進数 & 先頭7bit目を反転
$a = [Convert]::ToInt32($r[0],16) -bxor 2
# 10進数→16進数
$r[0] = ([convert]::ToString($a, 16)).ToUpper()
return @(($r[0..1] -join ""), ($r[2..3] -join ""), ($r[4..5] -join ""), ($r[6..7] -join "")) -join $delimiter
}
WindowsはインターフェースIDをランダムに生成
IPv6 アドレスが割り当てられたWindows 10でインターフェースIDを確認すると全く違う値になっています。当初「計算方法が違っているのか?」と思いましたが、実はWindowsの仕様でした。
Windowx XP時代の古いドキュメントですが、RFC 3401の技術仕様によるもの。
まだまだ知らない事ばかりです。精進精進...
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_ip_v6_imp_addr7.mspx?mfr=true