在 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 格式是意外的,因为 01
和 00
地址只包括 1
和 0
,而不是 01
和 00
.似乎允许格式为 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
我想在 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 格式是意外的,因为 01
和 00
地址只包括 1
和 0
,而不是 01
和 00
.似乎允许格式为 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