鍍金池/ 問答/HTML/ 用websocket前后端通信,后端傳64位二進(jìn)制給前端,前端怎么將二進(jìn)制轉(zhuǎn)為后

用websocket前后端通信,后端傳64位二進(jìn)制給前端,前端怎么將二進(jìn)制轉(zhuǎn)為后端服務(wù)中定義的Long型?

1、后端將一個long型數(shù)據(jù)轉(zhuǎn)變?yōu)?4位二進(jìn)制,通過websocket傳給前端,前端接收到一個ArrayBuffer對象,用getFloat64讀取內(nèi)存的數(shù)據(jù),轉(zhuǎn)為整數(shù),可是發(fā)現(xiàn)與后端定義的數(shù)據(jù)不一致。

2、例如后端傳的值是200000000001,前端接收到的為一個8字節(jié)的ArrayBuffer,用Int8Array取出,得到一個8位有符號整數(shù)[0, 0, 0, 46, -112, -19, -48, 1],并且取到的值與后端提供的二進(jìn)制是一致的。

3、數(shù)據(jù)轉(zhuǎn)換如下:
clipboard.png

4、后端返回的ArrayBuffer、轉(zhuǎn)化的Int8Array數(shù)組以及用Float64Array得到的值:

clipboard.png

回答
編輯回答
撿肥皂

function DecodeFloat64Array(Float64){

var dv = new DataView(Float64);
var newBuffer = Float64.slice(0, 8);
var udata = Array.from(new Int8Array(dv.buffer, dv.byteOffset, dv.byteLength));
var ans = 0;
for (var i = 0;i < 8;i++){
    if (udata[i] < 0) udata[i] += 256;
    ans = ans * 256 + udata[i];
}
return ans;

}

2018年5月18日 14:25
編輯回答
吢丕

目前跟WebSocket傳輸二進(jìn)制相關(guān)的博客還在整理 預(yù)計在這周寫完發(fā)出,應(yīng)該能夠解決你的問題~~
2018年3月28日更新:WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)
https://segmentfault.com/a/11... 你可以看下這個能不能解決你的疑惑 如果還有問題給我留言就行~~

2017年12月17日 00:26