在JavaScript中将字节数组转换为数字
我有从web服务检索数字向量的JavaScript代码。原始数据是一个双精度数组,它被转换为字节数组,然后进行base64编码。我用JavaScript从base64解码,但我不知道如何将结果字节转换成数字数组。这是我头脑中唯一能想到的方法在JavaScript中将字节数组转换为数字,javascript,Javascript,我有从web服务检索数字向量的JavaScript代码。原始数据是一个双精度数组,它被转换为字节数组,然后进行base64编码。我用JavaScript从base64解码,但我不知道如何将结果字节转换成数字数组。这是我头脑中唯一能想到的方法 function bytesToDouble(str,start) { start *= 8; var data = [str.charCodeAt(start+7), str.charCodeAt(start
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
函数bytesToDouble(str,start){
起始*=8;
变量数据=[str.charCodeAt(开始+7),
str.charCodeAt(起始+6),
str.charCodeAt(起始+5),
str.charCodeAt(起始+4),
str.charCodeAt(起始+3),
str.charCodeAt(起始+2),
str.charCodeAt(开始+1),
str.charCodeAt(开始+0)];
变量符号=(数据[0]&17;
var exponent=((数据[0]&127)我假设我们在web服务(c#)中使用了这个函数来将双数组数据编码为字符串:
//Input: [552.4, 539.8]
//Output: IOz0gCAsscA=
private string ConvertToSerializableString(double[] input)
{
byte[] data = new byte[input.Length * 4];
for (int i = 0; i < input.Length; i++)
{
int source = (int)(input[i] * 1E6);
int dataIndex = i * 4;
data[dataIndex] = (byte)((source >> 24) & 0xFF);
data[dataIndex + 1] = (byte)((source >> 16) & 0xFF);
data[dataIndex + 2] = (byte)((source >> 8) & 0xFF);
data[dataIndex + 3] = (byte)(source & 0xFF);
}
return Convert.ToBase64String(data);
}
//输入:[552.4539.8]
//输出:IOz0gCAsscA=
私有字符串ConvertToSerializableString(双[]输入)
{
字节[]数据=新字节[input.Length*4];
for(int i=0;i>24)和0xFF);
数据[dataIndex+1]=(字节)((源>>16)和0xFF);
数据[dataIndex+2]=(字节)((源>>8)和0xFF);
数据[dataIndex+3]=(字节)(源和0xFF);
}
返回Convert.tobase64字符串(数据);
}
然后,我们可以使用以下客户端脚本(javascript)对其进行解码:
var base64EncodedDoubleArrayData = "IOz0gCAsscA=";
var byteData = window.atob(base64EncodedDoubleArrayData);
var doubleArray = [];
for (var iColumn = 0; iColumn < byteData.length; iColumn = iColumn + 4)
{
var item = (byteData.charCodeAt(iColumn) << 24) + (byteData.charCodeAt(iColumn + 1) << 16) + (byteData.charCodeAt(iColumn + 2) << 8) + byteData.charCodeAt(iColumn + 3);
var doubleResult = parseFloat(item/1e6);
doubleArray.push(doubleResult);
}
//it should return something like doubleArray = [552.4, 539.8]
var base64EncodedDoubleArrayData=“IOz0gCAsscA=”;
var byteData=window.atob(base64EncodedDoubleArrayData);
var doubleArray=[];
对于(var iColumn=0;iColumn var item=(byteData.charCodeAt(iColumn)我不确定您的数据是什么样子的,但是您可以使用.split(“delimiterCharacter”)从分隔数据创建一个数组呃,双精度数据作为字节序列-我想,你必须手动实现。我找到了一个算法将双精度数据转换为字节,也许你可以将其反转。你能提供一些示例数据吗?@alecgorge这里是使用console.log()打印的内容base64解码后:l²¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨@在这两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区,在两个不同的地区之间,在在两个不同的地区,在在两个不同的地区,在两个不同的地区,在他们在两个不同的地区,在他们在他们之间之间,在他们在两个不同的不同的地区,在他们在他们在不同的不同的不同的不同的地区,在他们在他们在他们在他们之间,在他们在他们在他们之间,在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们之间,在他们在他们之间,在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们在他们"z","j","h","h","代码","T","T"0","D","h@亚比尔:这有点笨拙。a中的base64编码数据如何?谢谢。这对我很有用。我用了其他代码来解码base64,所以不太关心atob
问题。我会注意准确性问题,但一般来说,我的数据不需要特别高的精度,所以应该可以。