16

非常に大きな16進数を10進数に変換しようとしていますが、あまり成功していません。私の問題は、14 桁を超える 16 進数を変換しようとすると、 deciaml = parseInt(hex, 16) を使用すると数値にエラーが発生することです。

Java ではこれに問題はありませんが、Javascript は 14 桁以上の 16 進数では正確ではないようです。

「BigNumber」を試しましたが、同じ誤った結果が得られます。

私はできる限り Web をトロールして、変換を行う Web サイトを見つけましたが、手書きの変換を行う方法を理解できません。

私は順番に各文字を取得し、その係数を掛けようとしました 123456789abcdef 15 * Math.pow(16, 0) + 14 * Math.pow(16, 1).... などですが、私は思います (noob であること)私のサブルーチンは、私が完全に(そして私は本当に違うという意味です!)答えを得たので、本来あるべきすべてではないかもしれません。

皆さんのお役に立てば、これまでに書いたものを投稿してご覧いただけますが、誰かが私に簡単な答えをくれることを願っています.

   <script>
   function Hex2decimal(hex){

   var stringLength = hex.length;
   var characterPosition = stringLength;
   var character;

   var hexChars = new Array();
   hexChars[0] = "0";
   hexChars[1] = "1";
   hexChars[2] = "2";
   hexChars[3] = "3";
   hexChars[4] = "4";
   hexChars[5] = "5";
   hexChars[6] = "6";
   hexChars[7] = "7";
   hexChars[8] = "8";
   hexChars[9] = "9";
   hexChars[10] = "a";
   hexChars[11] = "b";
   hexChars[12] = "c";
   hexChars[13] = "d";
   hexChars[14] = "e";
   hexChars[15] = "f";

   var index = 0;
   var hexChar;
   var result;

   //   document.writeln(hex);

while (characterPosition >= 0)
{
   //   document.writeln(characterPosition);
character = hex.charAt(characterPosition);

    while (index < hexChars.length)
    {
   //       document.writeln(index);
    document.writeln("String Character = " + character);
    hexChar = hexChars[index];
    document.writeln("Hex Character = " + hexChar);

        if (hexChar == character)
        {
        result = hexChar;
        document.writeln(result);
        }

    index++
    }

   //   document.write(character);
characterPosition--;
}

return result;
   }
   </script>

ありがとうございました。

ポール

4

5 に答える 5

22

Ok, let's try this:

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;
}

Test:

t = 'dfae267ab6e87c62b10b476e0d70b06f8378802d21f34e7'
console.log(h2d(t)) 

prints

342789023478234789127089427304981273408912349586345899239

which is correct (feel free to verify).

于 2012-09-21T15:47:02.490 に答える
1

「0x」+「ff」は 255 と見なされるため、16 進値を文字列に変換し、先頭に「0x」を追加します。

function Hex2decimal(hex)
{
    return ("0x" + hex) / 1;
} 
于 2012-09-21T16:15:25.640 に答える
0

JavaScript には単一の数値型 (double) しかなく、個別の整数型は提供されないことに注意してください。そのため、数値の正確な表現を保存できない場合があります。

正確な結果を得るには、BigInt.jsなどの任意精度の整数用のライブラリを使用する必要があります。たとえば、コードは次のとおりです。

var x = str2bigInt("5061756c205768697465",16,1,1);
var s = bigInt2str(x, 10);
$('#output').text(s);

0x5061756c205768697465の期待される結果に正しく変換され379587113978081151906917ます。

上記のコードを試してみたい場合は、jsfiddle を使用してください

于 2012-09-21T14:54:28.573 に答える