Joshua Bambrick
Joshua Bambrick

Reputation: 2699

Convert A Large Integer To a Hex String In Javascript

I need to find a way to convert a large number into a hex string in javascript. Straight off the bat, I tried myBigNumber.toString(16) but if myBigNumber has a very large value (eg 1298925419114529174706173) then myBigNumber.toString(16) will return an erroneous result, which is just brilliant. I tried writing by own function as follows:

function (integer) {
    var result = '';

    while (integer) {
        result = (integer % 16).toString(16) + result;
        integer = Math.floor(integer / 16);
    }
}

However, large numbers modulo 16 all return 0 (I think this fundamental issue is what is causing the problem with toString. I also tried replacing (integer % 16) with (integer - 16 * Math.floor(integer/16)) but that had the same issue.

I have also looked at the Big Integer Javascript library but that is a huge plugin for one, hopefully relatively straightforward problem.

Any thoughts as to how I can get a valid result? Maybe some sort of divide and conquer approach? I am really rather stuck here.

Upvotes: 16

Views: 16502

Answers (3)

Robert Brisita
Robert Brisita

Reputation: 5844

The approach I took was to use the bignumber.js library and create a BigNumber passing in the value as a string then just use toString to convert to hex:

  const BigNumber = require('bignumber.js');
  const lrgIntStr = '1298925419114529174706173';
  const bn = new BigNumber(lrgIntStr);
  const hex = bn.toString(16);

Upvotes: 2

Collin Anderson
Collin Anderson

Reputation: 15444

Assuming you have your integer stored as a decimal string like '1298925419114529174706173':

function dec2hex(str){ // .toString(16) only works up to 2^53
    var dec = str.toString().split(''), sum = [], hex = [], i, s
    while(dec.length){
        s = 1 * dec.shift()
        for(i = 0; s || i < sum.length; i++){
            s += (sum[i] || 0) * 10
            sum[i] = s % 16
            s = (s - sum[i]) / 16
        }
    }
    while(sum.length){
        hex.push(sum.pop().toString(16))
    }
    return hex.join('')
}

Upvotes: 14

Joshua Bambrick
Joshua Bambrick

Reputation: 2699

The numbers in question are above javascript's largest integer. However, you can work with such large numbers by strings and there are some plugins which can help you do this. An example which is particularly useful in this circumstance is hex2dec

Upvotes: 4

Related Questions