背景
javascript中生成ArrayBuffer,通过Websocket 发送,C#接收,发现int32的整数解析不对,才发现从整型获得字节数组时会出现大小端不统一的情况。
大端与小端
大端字节序(高位在前,低位在后),即数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。以UInt16的整数1为例:
大端模式: 0000 0000 0000 0001
小端模式: 0000 0001 0000 0000
function radarStartWork() {
var code = $("#pointList").val();
var buffer = new ArrayBuffer(21);
var view = new DataView(buffer);
view.setUint8(0, 2);//标志头
view.setInt32(1, code);//雷达编号
view.setInt32(5, 1);//协议类型
view.setUint8(9, 90);//主控头
view.setUint8(10, 90);
view.setInt32(11, code);//雷达编号
view.setUint8(15, 3);//命令码
view.setUint8(16, 0);//扩展码
view.setInt32(17, 0);//数据长度
ws.send(view);
}
C#中采用的小端,而js中采用的大端。
如何解决
在DataView中的set方法中使用参数true即可,如下
function radarStartWork() {
var code = $("#pointList").val();
var buffer = new ArrayBuffer(21);
var view = new DataView(buffer);
view.setUint8(0, 2);//标志头
view.setInt32(1, code, true);//雷达编号
view.setInt32(5, 1, true);//协议类型
view.setUint8(9, 90);//主控头
view.setUint8(10, 90);
view.setInt32(11, code, true);//雷达编号
view.setUint8(15, 3);//命令码
view.setUint8(16, 0);//扩展码
view.setInt32(17, 0, true);//数据长度
ws.send(view);
}
DataView 视图提供 8 个方法写入内存。
setInt8
:写入 1 个字节的 8 位整数。setUint8
:写入 1 个字节的 8 位无符号整数。setInt16
:写入 2 个字节的 16 位整数。setUint16
:写入 2 个字节的 16 位无符号整数。setInt32
:写入 4 个字节的 32 位整数。setUint32
:写入 4 个字节的 32 位无符号整数。setFloat32
:写入 4 个字节的 32 位浮点数。setFloat64
:写入 8 个字节的 64 位浮点数。
这一系列set
方法,接受两个参数,第一个参数是字节序号,表示从哪个字节开始写入,第二个参数为写入的数据。对于那些写入两个或两个以上字节的方法,需要指定第三个参数,false
或者undefined
表示使用大端字节序写入,true
表示使用小端字节序写入。