首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递增MAC地址

递增MAC地址
EN

Stack Overflow用户
提问于 2011-04-15 07:00:37
回答 5查看 4.8K关注 0票数 1

我正在尝试开发一个脚本,它将在一定程度上从给定的起始基数生成MAC地址列表。我的输入是一个MAC地址列表,并且需要递增1。

示例:

00:1D:FE:12:37:1A (需要生成00:1D:FE:12:37:1B)

00:1D:FE:12:37:49 (需要生成00:1D:FE:12:37:4A)

00:1D:FE:12:37:4F (需要生成00:1D:FE:12:37:50)

这里的限制是,我需要在一台既没有安装也没有可用的“额外”perl模块的机器上运行这个脚本,因此需要将代码包含在脚本中。这意味着Net::MAC是作为一个模块出现的,但我可以合并一些有用的部分并包含它,但我认为我正在尝试做的事情不应该完全复杂,无法在一个小函数中利用pack(?)或者类似的东西。

我在PerlMonks这样的论坛上找到了各种各样的帖子,但似乎没有人有一个明确的答案。任何意见都将不胜感激!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-15 07:12:35

这是一个48位的数字。解析它,增加它,格式化它。

许多Perl构建只支持32位数字作为整数,因此我将避免形成更大的整数。

代码语言:javascript
复制
my $mac_str = '00:1D:FE:12:37:1A';

( my $mac_hex = $mac_str ) =~ s/://g;
my ($mac_hi, $mac_lo) = unpack("nN", pack('H*', $mac_hex));

if ($mac_lo == 0xFFFFFFFF) {
    $mac_hi = ($mac_hi + 1) & 0xFFFF;
    $mac_lo = 0;
} else {
    ++$mac_lo;
}

$mac_hex = sprintf("%04X%08X", $mac_hi, $mac_lo);
$mac_str = join(':', $mac_hex =~ /../sg);
票数 8
EN

Stack Overflow用户

发布于 2011-04-15 12:19:25

我不知道perl,但我在python中做过but地址递增。代码添加到此处

代码语言:javascript
复制
def getmacaddress_increment(macinst, rowindex):
inst = gethex_todecimal(macinst)
macarray = inst.split('.')
instarr = []
seg5 = int(macarray[5]) + rowindex       
if seg5 > 255:
    macarray[5] = str(seg5%255)
    seg4 = int(macarray[4])
    macarray[4] = str(seg4 + int(seg5/255))
else:
    macarray[5] = str(seg5)

seg4 = int(macarray[4])           
if seg4 > 255:
    macarray[4] = str(seg4%255)
    seg3 = int(macarray[3])
    macarray[3] = str(seg3 + int(seg4/255))
else:
    macarray[4] = str(seg4)

seg3 = int(macarray[3])           
if seg3 > 255:
    macarray[3] = str(seg3%255)
    seg2 = int(macarray[2])
    macarray[2] = str(seg2 + int(seg3/255))
else:
    macarray[3] = str(seg3)

seg2 = int(macarray[2])
if seg2 > 255:
    macarray[2] = str(seg2%255)
    seg1 = int(macarray[1])
    macarray[1] = str(seg1 + int(seg2/255))

seg1 = int(macarray[1])
if seg1 > 255:
    macarray[1] = '0'
    seg0 = int(macarray[0])
    macarray[0] = str(seg0 + 1)

seg0 = int(macarray[0])
if seg0 > 255:
    macarray[0] = '0'
arr = []
#newval = macarray[0] + '.' + macarray[1] + '.' + macarray[2] + '.' + macarray[3] + '.' + macarray[4] + '.' + macarray[5]        
#print 'Updated value: ', newval
for cnt, instr in enumerate(macarray):
   arr.append("%0.2x" % int(instr))
return ':'.join(arr)

def toint(macid):   
    return str(int(macid, 16))

def gethex_todecimal(macaddr):
   macaddr = macaddr.replace('-', ':')
   inst = map(toint, macaddr.split(':'))
   return '.'.join(inst)

检查是否可以使用此逻辑在perl中递增。对不起,我没有一个直接的答案。

湿婆

票数 1
EN

Stack Overflow用户

发布于 2011-12-13 22:02:59

在这里,我使用代码来递增MAC地址,但是在最后一个位置,当我们递增MAC地址时,它会溢出,所以我使用了从00开始的代码

例如:如果最后一个位置是FF,则它到起点00

代码语言:javascript
复制
#!/bin/sh
mac=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f1-5)
maclast=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f6)
echo "Mac address= $mac:$maclast"
decmac=$(echo "ibase=16; $maclast"|bc)
echo $decmac
if [ $decmac -eq '241' ]
then
    macinc='00'
else
    incout=`expr $decmac + 1 `
    macinc=$(echo "obase=16; $incout"|bc)
fi
echo "Mac address= $mac:$macinc"

输出:

Mac address= 00:19:D1:F6:F7:FF

Mac address= 00:19:D1:F6:F7:00

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5670685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档