首页 > 解决方案 > 使用 JavaScript 将 4 位字节数组转换为 int

问题描述

使用网络套接字,我将一个 4 位字节数组发送到我的 JS 库。这个字节数组代表一个数字,我想读回那个数字,但都是在 JavaScript 中。我发现很多相反的例子和将字节数组读入字符串的例子。

在我的 C# 代码中:

    public static void SendImage(byte[] blobArray,
        byte[] imageArray , string ts)
    {
        var blobSize = BitConverter.GetBytes(blobArray.Length);
        var tsHdr = Encoding.ASCII.GetBytes(ts);
        byte[] newPacket = new byte[imageArray.Length + tsHdr.Length + blobArray.Length+4];
        Buffer.BlockCopy(tsHdr, 0, newPacket, 0, tsHdr.Length);
        Buffer.BlockCopy(blobSize, 0, newPacket, 17, 4);
        Buffer.BlockCopy(blobArray, 0, newPacket, tsHdr.Length+4, blobArray.Length);
        Buffer.BlockCopy(imageArray, 0, newPacket, tsHdr.Length+4+ blobArray.Length, imageArray.Length);

     }

这会传递一个时间戳(占用 17 位)。然后 4 位用于第一张图像的 len。然后是图像本身。然后是第二张图。

因此,从 JS 中读取所有内容:

ws.onmessage = function (e) {
        try {
                var ts = String.fromCharCode.apply(String, new Uint8Array(e.data, 0, 17));
                var year = ts.substr(0, 4);
                var month = ts.substr(4, 2);
                var day = ts.substr(6, 2);
                var hour = ts.substr(8, 2);
                var min = ts.substr(10, 2);
                var second = ts.substr(12, 2);
                var mil = ts.substr(14, 3);

                liveTimeStamp = hour + "-" + min + "-" + second + "-" + mil + "  " + day + "/" + month + "/" + year;
                var blobLen= e.data.slice(17, 4);
                vat img1 = 'data:image/jpeg;base64,' + arrayBufferToBase64(e.data.slice(21, blobLen ));
               var img2 = "data:image/jpeg;base64," + arrayBufferToBase64(e.data.slice(21 + blobLen, len - blobLen + 21)); 
    };

标签: javascriptarrays

解决方案


假设您的 C# 代码正在生成 little-endian 数据,您应该能够Uint32从您Uint8Array使用的DataView类型中提取 a ,如下所示:

var data = new Uint8Array(e.data);
var dataView = new DataView(data.buffer);
var blobLen = dataView.getUint32(17, true); // false for big-endian

推荐阅读