在 MacOS 上使用 "arp -a" 工具的奇怪 MAC 地址格式

Weird MAC address format using "arp -a" tool on MacOS

我想在 MacOS 上解析 arp -a 命令的输出,在 Go 中使用 net.ParseMAC 函数,但是由于奇怪的格式我遇到了错误。 arp -a 命令的示例输出:

> arp -a 
? (192.168.1.1) at 0:22:7:4a:21:d5 on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]

MAC 格式是意外的,因为 0100 地址只包括 10,而不是 0100 .似乎允许格式为 A:B:C:D:E:F 而不是 AA:BB:CC:DD:EE:FF.

如何以后一种格式输出,以便net.ParseMAC函数可以接受?


编辑: 我做了一个简单的 Go 函数来解决遗漏前导零的问题:

// FixMacOSMACNotation fixes the notation of MAC address on macOS.
// For instance: 1:0:5e:7f:ff:fa becomes 01:00:5e:7f:ff:fa
func FixMacOSMACNotation(s string) string {
    var newString string
    split := strings.Split(s, ":")
    for i, s := range split {
        if i != 0 {
            newString += ":"
        }
        if len(s) == 1 {
            newString += "0" + s
        } else {
            newString += s
        }
    }
    return newString
}

然后可以在net.ParseMAC中成功使用。

此版本使用 strings.Builder 根据 OP 的需要修复给定的输入。

A [strings.]Builder is used to efficiently build a string using Write methods. It minimizes memory copying. The zero value is ready to use. Do not copy a non-zero Builder.

package main

import (
    "fmt"
    "strings"
)

func main() {
    inputs := []string{
        "1:0:5e:7f:ff:fa",
        "1:0:5e:7f:ff:f",
        "1:0:5e:7f:ff:",
        "1:0:5e::ff:",
    }

    for _, input := range inputs {
        fmt.Println()
        fmt.Println("FixMacOSMACNotation    ", FixMacOSMACNotation(input))
    }
}

// FixMacOSMACNotation fixes the notation of MAC address on macOS.
// For instance: 1:0:5e:7f:ff:fa becomes 01:00:5e:7f:ff:fa
func FixMacOSMACNotation(s string) string {
    var e int
    var sb strings.Builder
    for i := 0; i < len(s); i++ {
        r := s[i]
        if r == ':' {
            for j := e; j < 2; j++ {
                sb.WriteString("0")
            }
            sb.WriteString(s[i-e : i])
            sb.WriteString(":")
            e = 0
            continue
        }
        e++
    }
    for j := e; j < 2; j++ {
        sb.WriteString("0")
    }
    sb.WriteString(s[len(s)-e:])
    return sb.String()
}

试一试here