数据转换

node数据转换

string(或json字符串)转 stream

1
2
3
4
5
6
function createStream (str) {
const rv = new PassThrough() // PassThrough is also a Readable stream
rv.push(str)
rv.push(null)
return rv
}

buffer 转 stream

1
2
3
4
5
6
7
let Duplex = require('steam').Duplex
function bufferToStream() {
let stream = new Duplex()
stream.push(buffer)
stream.push(null)
return stream
}

string(或json字符串)转 buffer

1
Buffer.from(str)

stream 转 buffer

1
2
3
4
5
6
7
8
9
10
11
12
function (){
return new Promise((resolve, reject) => {
let = buffers = []
stream.on('error', reject)
stream.on('data', data => {
return buffers.push(data)
})
stream.on('end', () => {
resolve(Buffer.concat(buffers))
})
})
}

buffer 转 string(或json对象)

1
2
3
4
const bigBuf = Buffer.concat(bufferArray) // bufferArray 是 bytes 数组
const str = bigBuf.toString()
// 如果str是json字符串
const jsonObj = JSON.parse(str)

stream 转json

见上述两者之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 1. 流读取:
const fs = require('fs');
const readStream = fs.createReadStream('./test.txt');

let data = '';
readStream.setEncoding('utf8');
readStream.on('data', function(chunk){
data+=chunk;
});
readStream.on('end', function(){
console.log(data);
console.log('流读取结束');
});
readStream.on('error', function(err){
console.log(err);
});
console.log('执行结束!');

// 2. 写入流:
const fs = require('fs');

const writeStream = fs.createWriteStream('./test.txt',{'flags':'a'});
let data = '测试内容!!!';
writeStream.write(data, 'utf8');
writeStream.end();

writeStream.on('finish', function(){
console.log('写入结束!');
});
writeStream.on('error', function(err){
console.log(err);
});
console.log('执行结束!!!!!');

blob 转 string(或json对象)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 1. blob url
const mediaResponse = await fetch(url)
const data = await mediaResponse.arrayBuffer()
const buf = await importKeyAndDecrypt(key, data, iv)
const reader = new FileReader
reader.onload = async () => {
elementInfoSrc.value = (await reader.result) as string
}
reader.readAsDataURL(new Blob([buf]))
// 2. string 或 json
// http response
// response.type == 'application/json'
const reader = new Reader()
reader.readAsText(response, 'utf-8')
reader.onload = () => {
const str = reader.result
const json = JSON.parse(str)
}

其它API介绍

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。Blob 表示的不一定是 JavaScript 原生格式的数据。File 接口基于 Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

ArrayBuffer 对象代表储存二进制数据的一段内存,它不能直接读写,只能通过视图(TypedArray 视图和 DataView 视图)来读写,视图的作用是以指定格式解读二进制数据。

Uint8Array 对象是 ArrayBuffer 的一个数据类型(8 位不带符号整数)。

TextEncoder 接受代码点流作为输入,并提供 UTF-8 字节流作为输出。

TextDecoder 接口表示一个文本解码器,一个解码器只支持一种特定文本编码,例如 utf-8、iso-8859-2、koi8、cp1261,gbk 等等。解码器将字节流作为输入,并提供代码点流作为输出。

注意: 二进制数组并不是真正的数组,而是类似数组的对象。

字符与ArrayBuffer,Uint8Array相互转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

// 1. TextEncoder => ArrayBuffer
let encoder = new TextEncoder();

// 字符 转 Uint8Array
let uint8Array = encoder.encode("你好啊");

// Uint8Array 转 ArrayBuffer
let arrayBuffer = uint8Array.buffer

// 2. Blob => ArrayBuffer
let str = 'hello,你好吗?'
let blob = new Blob([str],{type:'text/plain;charset=utf-8'});
let utf8decoder = new TextDecoder()
blob.arrayBuffer().then(buffer=>{
// ArrayBuffer
console.log(buffer)
let text = utf8decoder.decode(buffer)
// String
console.log(text)
})

// 3. FileReader => ArrayBuffer
let str = 'hello,你好吗?'
let blob = new Blob([str],{type:'text/plain;charset=utf-8'});
let utf8decoder = new TextDecoder()
let fr = new FileReader()
fr.readAsArrayBuffer(blob)
fr.onload = function(res) {
// ArrayBuffer
let buffer = fr.result
console.log(buffer)
let text = utf8decoder.decode(buffer)
// String
console.log(text)
}

数据转换
http://example.com/20220511-数据转换/
作者
csorz
发布于
2022年5月11日
许可协议