IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Js字节数组问题 -> 正文阅读

[开发工具]Js字节数组问题

Js字节数组问题

前后端进行字节数组对接的问题

后端

后端采用C#编写(具体使用语言看要求)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FFmpegDemo.Protocol
{
    /// <summary>
    /// 后端协议
    /// </summary>
    public class ProtocolDefalut
    {
        //Json数据 + 0x00 + 扩展数据(byte数组)
        //{“a”:1} + byte[]
        //0x7B,0x22,0x61,0x22,0x3A,0x31,0x7D,0x00,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn

        /// <summary>
        /// 协议对象
        /// </summary>
        public class ProtocolDataModel
        {
            /// <summary>
            /// json数据
            /// </summary>
            public string JsonStr { get; set; }
            /// <summary>
            /// 扩展数据
            /// </summary>
            public byte[] ExtendData { get; set; } = new byte[0];
        }

        public Encoding TextEncoding { get; set; } = Encoding.UTF8;
        /// <summary>
        /// 构建 buffer
        /// </summary>
        /// <returns></returns>
        public byte[] Build(ProtocolDataModel model)
        {
            var jsonBytes = TextEncoding.GetBytes(model.JsonStr);
            var buffer = new byte[jsonBytes.Length + 1 + model.ExtendData.Length];
            //json部分
            var jsonStartIndex = 0;
            var jsonLength = jsonBytes.Length;
            Array.Copy(jsonBytes, 0, buffer, jsonStartIndex, jsonLength);
            //分割符
            var splitIndex = jsonBytes.Length;
            buffer[splitIndex] = 0x00;
            //扩展部分
            var extendStartIndex = splitIndex + 1;
            var extendLength = model.ExtendData.Length;
            Array.Copy(model.ExtendData, 0, buffer, extendStartIndex, extendLength);
            return buffer;
        }
        /// <summary>
        /// 解构 buffer
        /// </summary>
        /// <param name="datas"></param>
        /// <returns></returns>
        public ProtocolDataModel UnBuild(byte[] datas)
        {
            //找0x00进行分割
            var jsonLenth = datas.Length;
            var extendLength = 0;
            for (int i = 0; i < datas.Length; i++)
            {
                if(datas[i] == 0x00)
                {
                    jsonLenth = i;
                    break;
                }
            }
            extendLength = datas.Length - jsonLenth - 1;
            if(extendLength < 0)
            {
                extendLength = 0;
            }

            var jsonBytes = new byte[jsonLenth];
            var extendBytes = new byte[extendLength];

            //json部分
            var jsonStartIndex = 0;
            var jsonLength = jsonBytes.Length;
            Array.Copy(datas, jsonStartIndex, jsonBytes, 0, jsonLength);
            //分割符
            var splitIndex = jsonBytes.Length;
            //xxxxxx
            //扩展部分
            if(extendLength > 0)
            {
                var extendStartIndex = splitIndex + 1;
                Array.Copy(datas, extendStartIndex, extendBytes, 0, extendLength);
            }


            var model = new ProtocolDataModel()
            {
                JsonStr = TextEncoding.GetString(jsonBytes),
                ExtendData = extendBytes,
            };
            return model;
        }
    }
}

前端

前端采用js进行解析(用的是ts编写,然后转js)

class DataModel {
    public jsonStr: string;
    public radioData: number[];

    constructor(jsonStr: string, radioData: number[]) {
        this.jsonStr = jsonStr;
        this.radioData = radioData;
    }
}

class RadioProtocol {
    public buildPack = (model: DataModel) => {
        let jsonArr = this.str2utf8(model.jsonStr);
        let array = new Uint8Array(model.radioData.length + 1 + jsonArr.length);
        // 插入jsonArr
        array.set(jsonArr);
        // 插入radio Data
        array.set(model.radioData, jsonArr.length + 1);
        return array;
    }
    public unBuildPack = (data: Uint8Array) => {
        // 原始数据
        console.log(data)
        let splitIdx = data.length;
        for (let i = 0; i < data.length; i++) {
            if (data[i] === 0x00) {
                splitIdx=i;
            }
        }
        // jsonStr
        let jsonStrArr = data.slice(0,splitIdx);
        let jsonStr=this.utf82str(jsonStrArr);
        // radioData
        let radioData = data.slice(splitIdx+1);
        console.log(radioData)
        // @ts-ignore
        return new DataModel(jsonStr,radioData);
    }

    public str2utf8(str) {
        // @ts-ignore
        let ec = new TextEncoder('utf8');
        // @ts-ignore
        return ec.encode(str);
    }

    public utf82str(data) {
        // @ts-ignore
        let dec = new TextDecoder('utf8');
        // @ts-ignore
        return dec.decode(data);
    }
}
// 测试
let model = new DataModel('{“a”:1}', [0x7B, 0x22, 0x61, 0x22, 0x3A, 0x31, 0x7D, 0x01]);
let protocol = new RadioProtocol();
let data = protocol.buildPack(model);
let pack = protocol.unBuildPack(data);
console.log(pack)

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:25:26  更:2022-03-11 22:25:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:32:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码