Files
2026-04-13 12:41:48 +10:00

53 lines
1.2 KiB
Go

package scans
import (
"encoding/hex"
"fmt"
"strconv"
"strings"
)
// NormalizeMAC приводит ввод пользователя к виду aa:bb:cc:dd:ee:ff (как в FDB/ARP).
func NormalizeMAC(s string) string {
s = strings.ToLower(strings.TrimSpace(s))
if s == "" {
return ""
}
s = strings.ReplaceAll(s, "-", ":")
if strings.Count(s, ":") == 5 {
parts := strings.Split(s, ":")
if len(parts) != 6 {
return ""
}
var b [6]byte
for i, p := range parts {
n, err := strconv.ParseUint(strings.TrimSpace(p), 16, 8)
if err != nil {
return ""
}
b[i] = byte(n)
}
return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", b[0], b[1], b[2], b[3], b[4], b[5])
}
if strings.HasPrefix(s, "0x") {
h := strings.TrimPrefix(s, "0x")
h = strings.ReplaceAll(h, ":", "")
if len(h) != 12 {
return ""
}
raw, err := hex.DecodeString(h)
if err != nil || len(raw) != 6 {
return ""
}
return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", raw[0], raw[1], raw[2], raw[3], raw[4], raw[5])
}
if len(s) == 12 {
raw, err := hex.DecodeString(s)
if err != nil || len(raw) != 6 {
return ""
}
return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", raw[0], raw[1], raw[2], raw[3], raw[4], raw[5])
}
return ""
}