JavaScript-将24位十六进制数字转换为十进制,加1,然后再转换回?

理查德·汉密尔顿

对于MongoDB中的ObjectId,我使用24位十六进制数字。因为我需要跟踪第二个集合,所以需要在此十六进制数上加1。

就我而言,这就是我的价值

var value = "55a98f19b27585d81922ba0b"

我正在寻找的是

var newValue = "55a98f19b25785d81922ba0c"

我试图为此创建一个函数

function hexPlusOne(hex) {
    var num = (("0x" + hex) / 1) + 1;
    return num.toString(16);
}

这适用于较小的十六进制数

hexPlusOne("eeefab")
=> "eeefac"

但是对于我的哈希来说,它失败了

hexPlusOne(value)
=> "55a98f19b275840000000000"

有没有更好的方法来解决这个问题?

m69``干躁不受欢迎''

该版本将返回与输入字符串一样长的字符串,因此,如果输入类似“ ffffffff”,则溢出将被忽略。

function hexIncrement(str) {
    var hex = str.match(/[0-9a-f]/gi);
    var digit = hex.length;
    var carry = 1;

    while (digit-- && carry) {
        var dec = parseInt(hex[digit], 16) + carry;
        carry = Math.floor(dec / 16);
        dec %= 16;
        hex[digit] = dec.toString(16);
    }
    return(hex.join(""));
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("ffffffffffffffffffffffff"));

此版本可能返回比输入字符串长1个字符的字符串,因为像“ ffffffff”之类的输入会继续变为“ 100000000”。

function hexIncrement(str) {
    var hex = str.match(/[0-9a-f]/gi);
    var digit = hex.length;
    var carry = 1;

    while (digit-- && carry) {
        var dec = parseInt(hex[digit], 16) + carry;
        carry = Math.floor(dec / 16);
        dec %= 16;
        hex[digit] = dec.toString(16);
    }
    if (carry) hex.unshift("1");
    return(hex.join(""));
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("ffffffffffffffffffffffff"));

我很好奇,看看user2864740关于使用12位数据块的建议是否会带来任何好处。令我惊讶的是,尽管代码看起来更复杂,但实际上速度大约是它的两倍。但是第一个版本也每秒运行500,000次,因此您不会在现实世界中注意到它。

function hexIncrement(str) {
    var result = "";
    var carry = 1;
    while (str.length && carry) {
        var hex = str.slice(-12);
        if (/^f*$/i.test(hex)) {
            result = hex.replace(/f/gi, "0") + result;
            carry = 1;
        } else {
            result = ("00000000000" + (parseInt(hex, 16) + carry).toString(16)).slice(-hex.length) + result;
            carry = 0;
        }
        str = str.slice(0,-12);
    }
    return(str.toLowerCase() + (carry ? "1" : "") + result);
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("000000000000ffffffffffff") + "<BR>");
document.write(hexIncrement("0123456789abcdef000000000000ffffffffffff"));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用JavaScript将64位十六进制转换为十进制

在Javascript中将64位十六进制转换为十进制浮点数

如何在JavaScript中使用LOOP将十六进制转换为十进制

在javascript中,如何将十进制(带小数点)转换为十六进制字符串

如何在JavaScript中将十进制转换为十六进制

如何在JavaScript中将RGB十进制转换为十六进制颜色?

将货币转换为十进制数字JavaScript

在JavaScript中将大量数字从二进制转换为十进制再返回

JavaScript程序将二进制转换为十进制然后返回

JavaScript:十六进制到十进制转换器错误

Javascript ArrayBuffer转换为十六进制

JavaScript将RGB整数转换为十六进制

使用Javascript将十六进制数转换为Char

JavaScript 将十进制数转换为整数

Javascript将十进制幂转换为常规十进制

使用 JavaScript 手动将十进制字符串转换为数字

JavaScript-以字符串形式将十进制数转换为4位二进制数

Python:将一位数字十进制转换为十六进制

使用python将十六进制十进制数字转换为十进制

将十进制转换为二进制的最快方法-Javascript

在javascript中将ascii转换为十六进制

如何在JavaScript中将十六进制转换为ASCII?

javascript十六进制颜色转换为rgb函数

Python将十进制转换为十六进制

PHP将十进制转换为十六进制

将十六进制转换为十进制

Dart:将十进制转换为十六进制

lex:将十六进制转换为十进制

转换javascript十六进制代码