js 与 nodejs 的网络层的 字节流和 字符串 处理 (本文仅适用于中高级程序员)

本文深入探讨了JavaScript与Node.js在处理字节流和字符串时的关键技术,包括ArrayBuffer、Uint8Array、Buffer对象,以及WebSocket传输对象、文件和复合对象的策略。文章还介绍了如何制定文件协议进行字节串传输,并提供了参考代码。
摘要由CSDN通过智能技术生成

一般涉及到了框架底层开发, 必然需要与二进制流打交道, 也就是字节流

一 字节处理关键技术

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 传输特定文件协议 (通常协议包含多个字节串)

  1. 把每个部分内容 按照协议 转成 buffer或者 arraybuff
  2. 传输 buffer
  3. 接收buffer
  4. 根据协议函数 解析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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值