字节数组的大端与小端

背景

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表示使用小端字节序写入。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值