作者:Andyxiesz | 来源:互联网 | 2023-01-16 14:51
我在python中有一个工作脚本,根据指定的基数进行字符串到整数的转换long(16)
:
modulus=public_key["n"]
modulusDecoded = long(public_key["n"], 16)
打印:
8079d7ae567dd2c02dadd1068843136314fa3893fa1fb1ab331682c6a85cad62b208d66c9974bbbb15d52676fd9907efb158c284e96f5c7a4914fd927b7326c40efa14922c68402d05ff53b0e4ccda90bbee5e6c473613e836e2c79da1072e366d0d50933327e77651b6984ddbac1fdecf1fd8fa17e0f0646af662a8065bd873
和
90218878289834622370514047239437874345637539049004160177768047103383444023879266805615186962965710608753937825108429415800005684101842952518531920633990402573136677611127418094912644368840442620417414685225340199872975797295511475162170060618806831021437109054760851445152320452665575790602072479287289305203
分别.这看起来像十六进制到十进制转换.我想有同样的结果在JS,但parseInt()
并parseFloat()
产生完全不同的东西.最重要的是,Javascript似乎不喜欢输入字符串中的字符,有时会返回NaN.
任何人都可以提供一个函数/指导如何获得与Python脚本相同的功能?
1> Jonas Wilms..:
Javascript中的数字是浮点数,因此在某个数字后它们总是会丢失精度.要拥有无限数字,我们可以使用0到9之间的数字数组,它具有无限范围.要根据十六进制字符串输入执行此操作,我执行十六进制到int数组转换,然后使用double dabble算法将数组转换为BCD.这可以很容易打印:
const hexToArray = arr => arr.split("").map(n => parseInt(n,16));
const doubleDabble = arr => {
var l = arr.length;
for( var b = l * 4; b--;){
//add && leftshift
const overflow = arr.reduceRight((carry,n,i) => {
//apply the >4 +3, then leftshift
var shifted = ((i <(arr.length - l ) && n>4)?n+3:n ) <<1;
//just take the right four bits and add the eventual carry value
arr[i] = (shifted & 0b1111) | carry;
//carry on
return shifted > 0b1111;
}, 0);
// we've exceeded the current array, lets extend it:
if(overflow) arr.unshift(overflow);
}
return arr.slice(0,-l);
};
const arr = hexToArray("8079d7");
const result = doubleDabble(arr);
console.log(result.join(""));
试试吧