【问题标题】:Increase MAC-Address by 1将 MAC 地址增加 1
【发布时间】:2019-02-07 22:48:49
【问题描述】:

我需要将一个十六进制数(MAC 地址)加 1。

例如,我有一个这样格式的 MAC 地址:

00:A1:2C:3B:99:1F

而且我需要把这个值加1,并以同样的格式保存新值:

00:A1:2C:3B:99:20

查询:

UPDATE Info
SET MAC = HEXTORAW(TO_CHAR(
                     TO_NUMBER(SUBSTR(RAWTOHEX(MAC), 1, 20), RPAD('x', 20, 'x')) + 1,
                     RPAD('fm0', 22, 'X')
                )
                || SUBSTR(RAWTOHEX(MAC), 21))
WHERE ID = '';

【问题讨论】:

  • 有那个例子的MAC地址,加1后的值是多少?
  • 您使用 Oracle 还是 MySQL? (不要标记未涉及的产品...)
  • 加1后的值为:00:A1:2C:3B:99:20。我使用甲骨文...
  • 如果mac地址以:FF结尾怎么办?
  • 就我而言,mac-address 不以 :FF.... 结尾。

标签: sql oracle


【解决方案1】:

编辑:更新更新语句以处理单个数字 MAC 地址

这可行,但以:FF 结尾的情况将不起作用。

            create table test_utsav_mac(id integer,mac varchar2(20));

            insert into test_utsav_mac
            values
            (1,'01:26:5b:61:54:c0');

        UPDATE TEST_UTSAV_MAC
        SET MAC=  CASE WHEN LENGTH(LTRIM(TO_CHAR(TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1,'xxxx'))) = 1
        THEN SUBSTR(MAC,1,15) || '0' || LTRIM(TO_CHAR( TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1, 'xxxx' ))
        ELSE SUBSTR(MAC,1,15) || LTRIM(TO_CHAR( TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1, 'xxxx' ))
        END
        WHERE ID = 1

            select * from test_utsav_mac;

输出

ID   MAC
1   01:26:5b:61:54:c1

substr(mac,1,15) || ltrim(to_char( to_number( substr(mac,16,2) , 'xx' )+1, 'xxxx' )) 正在做的是

  • ltrim(to_char( to_number( substr(mac,16,2) , 'xx' )+1, 'xxxx' )) 是 将最后一个十六进制值转换为十进制并递增 1。
  • 然后我将其转换回十六进制并进行修剪。
  • 然后连接其余的 返回此结果的字符串。

PS:如果要在其中处理:FF 逻辑,则将其放入PL/SQL 块中,在这种情况下让它抛出异常。

【讨论】:

  • 看看你能不能找到在1之前追加0的方法。否则我明天去看看。
  • Ustav 你能看一下,在处理 :00 逻辑的情况下,如何在 1 之前附加一个 0?
  • 编辑了答案。请检查。
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 2011-10-08
  • 2013-08-11
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2018-12-08
  • 2020-09-19
相关资源
最近更新 更多