java数组转为数字_在JavaScript中将字节数组转换为数字

这是我能想到的唯一方法 .

function bytesToDouble(str,start) {

start *= 8;

var data = [str.charCodeAt(start+7),

str.charCodeAt(start+6),

str.charCodeAt(start+5),

str.charCodeAt(start+4),

str.charCodeAt(start+3),

str.charCodeAt(start+2),

str.charCodeAt(start+1),

str.charCodeAt(start+0)];

var sign = (data[0] & 1<<7)>>7;

var exponent = (((data[0] & 127) << 4) | (data[1]&(15<<4))>>4);

if(exponent == 0) return 0;

if(exponent == 0x7ff) return (sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

var mul = Math.pow(2,exponent - 1023 - 52);

var mantissa = data[7]+

data[6]*Math.pow(2,8*1)+

data[5]*Math.pow(2,8*2)+

data[4]*Math.pow(2,8*3)+

data[3]*Math.pow(2,8*4)+

data[2]*Math.pow(2,8*5)+

(data[1]&15)*Math.pow(2,8*6)+

Math.pow(2,52);

return Math.pow(-1,sign)*mantissa*mul;

}

var data = atob("AAAAAABsskAAAAAAAPmxQAAAAAAAKrF");

alert(bytesToDouble(data,0)); // 4716.0

alert(bytesToDouble(data,1)); // 4601.0

这应该会给你一个正确的方向,虽然我花了一段时间来记住如何处理doubles .

但需要注意的一个重要注意事项:

这依赖于 atob 进行base64解码,这在任何地方都不受支持,除此之外,这可能不是一个好主意 . 你真正想要做的是将base64编码的字符串展开到一个数字数组(字节将是最容易使用的,尽管不是地球上最有效的东西) . 原因是当 atob 发挥其魔力时,它会返回一个远非理想的字符串 . 根据编码它映射到的代码点(特别是对于128到255之间的代码点),生成的 .charCodeAt() 可能不会返回您期望的结果 .

并且可能存在一些准确性问题,因为毕竟我使用双倍来计算双倍,但我认为它可能没问题 .

使用Base64非常简单,因此您应该能够找出该部分 .

如果你确实切换到一个数组(而不是现在的 str 字符串),那么你显然会删除 .charCodeAt() 引用并直接得到你想要的索引 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值