[英]Javascript - hexadecimal string to decimal string
這個問題比最初看起來更復雜——盡管在概念上仍然相當簡單。
我將超出 javascript 最大范圍的大數字表示為十六進制數字字符串(這與 node-mysql 的bigNumberStrings
選項的方法一致)。
我只是想知道如何將一串十六進制數字轉換為一串相同數值的十進制數字? 顯然,這樣做很復雜,因為您不能使用大量的 javascript 進行數學運算。
盡管我還沒有找到一個標准解決方案,但我已經進行了大量搜索。
您可以使用像bignumber.js這樣的標准庫
Javascript
var hex = 'ABCDEF1234567890',
bignumber = new BigNumber(hex, 16);
console.log(bignumber.toString(10));
輸出
12379813812177893520
算法本身很簡單,所以不需要特殊的庫,它實際上做了你在紙上會做的事情,所以效率不會太低。
function hexToDec(s) {
var i, j, digits = [0], carry;
for (i = 0; i < s.length; i += 1) {
carry = parseInt(s.charAt(i), 16);
for (j = 0; j < digits.length; j += 1) {
digits[j] = digits[j] * 16 + carry;
carry = digits[j] / 10 | 0;
digits[j] %= 10;
}
while (carry > 0) {
digits.push(carry % 10);
carry = carry / 10 | 0;
}
}
return digits.reverse().join('');
}
它是如何工作的:基本上讀取十六進制數字並將它們添加到到目前為止計算的 dec 值的中間數組中。 每個新的十六進制數字意味着十進制數字的數組乘以 16,並且所有結轉都分配給更高階的數字。 while 循環它以將任何額外的結轉添加為數組中的新數字。 最后一行只是將 dec 數字數組轉換為字符串。
更新:當然,您可以通過將數字 10 替換為 10 的任何其他冪(100、1000、10000、100000,...)來提高算法的效率,並且它的工作原理相同。 中間值不超過尾數精度(52 位)的唯一要求。
該線程中的其他答案對我不起作用,但這個答案:
function h2d(s) {
function add(x, y) {
var c = 0, r = [];
var x = x.split('').map(Number);
var y = y.split('').map(Number);
while(x.length || y.length) {
var s = (x.pop() || 0) + (y.pop() || 0) + c;
r.unshift(s < 10 ? s : s - 10);
c = s < 10 ? 0 : 1;
}
if(c) r.unshift(c);
return r.join('');
}
var dec = '0';
s.split('').forEach(function(chr) {
var n = parseInt(chr, 16);
for(var t = 8; t; t >>= 1) {
dec = add(dec, dec);
if(n & t) dec = add(dec, '1');
}
});
return dec;
}
let s='7a', hex='0x'+s, dec=+hex; console.log(s,'->',dec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.