一般涉及到了框架底层开发, 必然需要与二进制流打交道, 也就是字节流
一 字节处理关键技术
1.1 js 字节处理
- ArrayBuffer 相当于 byte[],但是是只读的
- 如果要操作ArrayBuffer ,通常
new Uint8Array(ArrayBuffer )
这样封装
1.2 nodejs 字节处理
- nodejs 保留了 js 中的ArrayBuffer Uint8Array
- nodejs 新增了 一个更加方便的 Buffer 对象 ,相当于
ArrayBuffer 和 Uint8Array
的合体
二 4种解决方案
2.1 以字符串为传输载体
2.1.1websocket 传输一个普通对象
1.先把对象 通过JSON.stringify(对象)
转成 字符串
2.传输字符串,
3.对端接收字符串后,
4.再通过 JSON.parse(字符串) 转成对象
2.1.2 websocket 传输一个文件
1.先把文件 编码成 buffer,
2.再把buffer 编码成base64 字符串
3.传输 base64 字符串
4.对端接收 base64 字符串
5. 把 base64 字符串 转成文件
2.1.3 websocket 传输复合对象 (对象中包含文件)
1.先把文件 编码成 buffer,
2.再把buffer 编码成base64 字符串 S1
3.把 S1 付给 json对象, 例如{ filename:'测试文件',filetype:'gif',file :S1}
4.把 json对象转成 json字符串
5.传输 json字符串
6.对端接收 json字符串
7.解析成json 对象
8.读取json对象中的 [file] 属性值 S1
9. 把 S1 字符串 按 base64 解码 转成ArrayBuffer
…
2.2 以字节串为传输载体
什么是协议 ?
答:协议是自己规定文件的格式,
我们可以自己规定文件由几部分组成, 每个部分的含义是什么?
每个部分内容在文件的什么位置,
因为每个部分的内容都是字节串,所以整个文件就是多个字节串组合而成.
2.2.1 websocket 传输特定文件协议 (通常协议包含多个字节串)
- 把每个部分内容 按照协议 转成 buffer或者 arraybuff
- 传输 buffer
- 接收buffer
- 根据协议函数 解析buffer, 提取每个部分的内容
三 参考代码
test.js
import * as bfun from "../hyl/core/bfun.js"
import Base64 from "../hyl/core/base64.js"
import * as fun_nd from "../hyl/nodejs/fun.js"
let str = "我是待编码的字符@#%^%$&%(*&^()串"
console.log("str",str)
let base1=Base64.encode(str)
console.log("base1",base1)
let buf1=bfun.Base64ToBuffer(base1)
console.log("buf1",buf1)
let base2=bfun.BufferToBase64(buf1)
console.log("base2",base2)
let str2=Base64.decode(base2)
console.log("str2",str2)
console.log("------------ 1 ----------------")
let buf2_1=fun_nd.Utf8ToBuffer(str)
console.log("buf2_1",buf2_1)
let str2_1=fun_nd.BufferToUtf8(buf2_1)
console.log("str2_1",str2_1)
console.log("------------ 2 ---------------")
let buf3_1=bfun.strToUtf8Array(str)
console.log("buf3_1",buf3_1.buffer)
let str3_1=bfun.Utf8ArrayToStr(buf3_1)
console.log("str3_1",str3_1)
base64.js
/**
* utf8编码字符串 和 base64编码 互转
* encode : utf8编码字符串 >>base64编码
* decode : utf8编码字符串 << base64编码
*/
;var Base64 = functi