You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl实现HHHH.HHHH.HHHH格式MAC地址转HH:HH:HH:HH:HH:HH格式

Perl实现MAC地址格式转换(点分四段式转冒号分隔两位式)

需求说明

需要将输入格式为HHHH.HHHH.HHHH(H为十六进制字符,即网络设备常见的思科风格点分MAC,每段4个十六进制位,共3段)的MAC地址,转换为通用标准格式HH:HH:HH:HH:HH:HH,且需要嵌入现有LLDP信息解析脚本,对提取到的$chassisID变量做处理。

核心实现逻辑

转换分三步完成:

  • 对提取到的原始值做首尾空白去除,避免正则匹配带的多余空格影响处理
  • 移除MAC字符串中所有的点分隔符,得到连续12位的十六进制字符串
  • 将连续字符串按每2位为一组拆分,组间用冒号拼接,得到目标格式MAC

适配现有代码的修改方案

你原有代码中匹配Chassis ID的逻辑不需要改动,只需要在提取到$chassisID后增加转换步骤即可,修改后的完整代码片段如下:

if ($linha =~m/^Chassis ID/){
    my($chassisID) = $linha=~ /:(.*)/g;
    
    # 以下为新增的MAC格式转换逻辑
    $chassisID =~ s/^\s+|\s+$//g; # 去除首尾多余空白
    my $mac_no_dot = $chassisID;
    $mac_no_dot =~ s/\.//g; # 删除所有点分隔符
    # 按每2位拆分后用冒号拼接
    my $mac_standard = join(':', unpack('(A2)*', $mac_no_dot));
    
    # 存储转换后的标准MAC到结果哈希
    $lldpInfo{$localInt}{"chassisID"} = $mac_standard;
    print "转换完成的标准MAC: ".$mac_standard."\n";  
}

效果验证

用你提供的示例输入测试:

  • 原始行提取的初始$chassisID值: 4cf5.5b8b.f860(带前导空格)
  • 空白清理+去点后得到连续字符串:4cf55b8bf860
  • 最终转换输出:4c:f5:5b:8b:f8:60,完全符合HH:HH:HH:HH:HH:HH的格式要求。

可选优化

  • 增加合法性判断:在转换前先判断Chassis type字段值为MAC address时再执行转换,避免其他类型的Chassis ID被错误处理
  • 统一大小写:如果需要MAC地址统一为大写/小写,可以在转换后调用uc($mac_standard)转大写,或lc($mac_standard)转小写
  • 正则写法替代:如果不习惯用unpack拆分,也可以用正则替换实现拼接,代码如下:
    my $mac_standard = $mac_no_dot =~ s/([0-9a-fA-F]{2})/$1:/gr;
    $mac_standard =~ s/:$//; # 去掉末尾多余的冒号
    

内容的提问来源于stack exchange,提问作者ExploitZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:09:46