tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

MACアドレスをIPv6に変換する

【RTX1100】初期設定をLANケーブル接続で行う方法をpythonで書いただけ。光回線を契約したらwiresharkをインストールしてRTX1000 1100 ケーブル無しで設定 | システムガーディアン株式会社の結果と一致するか確かめる予定。

from typing import Tuple

def mac2ipv6(mac: str) -> str:
    if (len(mac) != 12):
        raise ValueError("bad input length {} ({})".format(len(mac), mac))
    for i in mac.lower():
        if i not in [hex(i)[2:] for i in range(16)]:
            raise ValueError("input should be hexadecimal: {}".format(mac))

    # 参考: https://pg.kdtk.net/1849
    mac_hex = "0x" + mac
    mac_bin = format(int(mac_hex, 16), "#b")

    # 7bit目をxorとマスクを使って反転
    mask = ["0", "b"] + ["0"]*48
    mask[7-1+2] = "1"
    mask = "".join(mask)
    tmp = hex(int(mac_bin, 2) ^ int(mask, 2))
    tmp = format(int(tmp, 16), "#014x") #12桁になるように0埋め

    # 中央にff:feを挿入
    tmp = tmp[:8] + "fffe" + tmp[8:]

    # 先頭にローカルアドレスfe80:0000:0000:0000相当のfe8000000000を追加
    # (サフィックスの0xは削除)
    tmp = tmp[2:]
    ipv6 = "fe80" + "0000" + "0000" + "0000" + tmp

    # 16bit区切りに変更
    ipv6 = ":".join([ipv6[4*i:4*i + 4] for i in range(8)])
    # ipv6_abbrev = "fe80::" + ":".join([tmp[4*i:4*i + 4] for i in range(4)])

    return ipv6