d85ec9ff61
Made-with: Cursor
53 lines
1.2 KiB
Go
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 ""
|
|
}
|