将24位十六进制数转换为十进制,加1,然后再转换回来
JavaScript - Convert 24 digit hexadecimal number to decimal, add 1 and then convert back?
对于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"
有更好的方法来解决这个问题吗?
此版本将返回与输入字符串一样长的字符串,因此如果输入是"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位块的建议是否会提供任何优势。令我惊讶的是,尽管代码看起来更复杂,但实际上它的速度是原来的两倍。但是第一个版本也是每秒运行50万次,所以在现实世界中你可能不会注意到。
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"));
这个错误是由于试图首先将整个24位十六进制值转换为一个数字,因为它不适合JavaScript可以明显表示的整数范围2。在进行这样的JavaScript数字转换时,会丢失一些准确性。
然而,它可以被处理为多个(例如。二)部分:做数学的右边部分,然后左边部分,如果需要,由于溢出1。(也可以一次处理一个数字,整个加法都是手动完成的。)
每个块的大小可以是12个十六进制数字,这使得它很容易分成两半。
1也就是说,如果右部分的最终数字大于0xffffffffff,则只需在左部分上结转(加)1。如果没有溢出,则左侧部分保持不变。
2参见JavaScript's的最高整数值,一个数字可以去不失去精度?
的范围是2^53,但输入值是16^24 ~ (2^4)^24 ~ 2^(4*24)~ 2^96;仍然是一个有效的数字,但是超出了可以明显表示的整数范围。
另外,在数字上下文中使用parseInt(str, 16)
而不是"0x" + str
来强制转换,因为它使意图更明确。
- 如何在JavaScript中将字符串转换为函数引用
- 如何在Javascript中将JSon对象转换为数组
- 使用JS将数组转换为json对象
- 如何使用json将对象列表从java转换为javascript
- 偶尔结结巴巴地说“;堆叠的”;translate()上的转换(v4.0.0-alpha40)
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 在Javascript中转换对象数组
- 将数字转换为一定数量的硬币
- 将纯文本URL转换为可单击链接
- 当图像转换为本地存储的DataURL时,EXIF被删除
- 如何使用js将SNAPSHOT内部版本号转换为3位数的整数
- 如何将TypeScript对象转换为普通对象
- JavaScript将人类可读的日期转换为unix时间戳,然后再转换回来
- 取消设置元素可见性,更改 innerHTML,然后转换回来
- 无法读取.js文件?如何转换回来
- 在将字符串转换为数组然后再转换回来时出现的Javascript问题
- JSON与Array的比较,有没有一种方法可以将一个转换为另一个,然后再转换回来
- 将24位十六进制数转换为十进制,加1,然后再转换回来
- 如何将 JS 对象转换为有效的 JSON 文件并使用 AJAX 将其检索回来
- 在.net中获取字符串的字节数组,并在Javascript中转换回来