gpt4 book ai didi

javascript - 将字节数组转换为 base128 有效的 JSON 字符串

转载 作者:搜寻专家 更新时间:2023-11-01 04:34:43 25 4
gpt4 key购买 nike

我想使用 JSON 发送大字节数组(我的灵感来自 this question ),为了减少开销,我想使用 base128 编码(实际上可以生成有效的 json 字符串)。但不幸的是,我无法找到一些在 JS 中进行转换的程序。我将发布我的程序作为这个问题的答案,但是可能有人有更短的程序或者可能是有效地在 JSON 中发送二进制数据的更好主意。

最佳答案

ES6:

编码

let bytesToBase128 = (bytesArr) => {
// 128 characters to encode as json-string
let c= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz¼½ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
let fbits=[];
let bits = (n,b=8) => [...Array(b)].map((x,i)=>n>>i&1);
bytesArr.map(x=> fbits.push(...bits(x)));

let fout=[];
for(let i =0; i<fbits.length/7; i++) {
fout.push(parseInt(fbits.slice(i*7, i*7+7).reverse().join(''),2))
};

return (fout.map(x => c[x])).join('');
}

// Example
// bytesToBase128([23, 45, 65, 129, 254, 42, 1, 255]) => "NÚ4AèßÊ0ÿ1"

解码

let base128ToBytes = (base128str) => {
// 128 characters to encode as json-string
let c= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz¼½ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"

dfout = base128str.split('').map(x=>c.indexOf(x));
let dfbits = [];
let bits = (n,b=8) => [...Array(b)].map((x,i)=>n>>i&1);
dfout.map(x=> dfbits.push(...bits(x,7) ));

let dfbytes=[];
let m1 = dfbits.length%8 ? 1 : 0;
for(let i =0; i<dfbits.length/8-m1; i++) {
dfbytes.push(parseInt(dfbits.slice(i*8, i*8+8).reverse().join(''),2))
};

return dfbytes;
}

// Example
// base128ToBytes("NÚ4AèßÊ0ÿ1") => [23, 45, 65, 129, 254, 42, 1, 255]

我在此处嵌入了 bits 函数 - here。这里的转换思路是将字节数组转换为位数组,然后取每7位(取值范围为0到127)作为字符列表c中的字符编号。译码时我们将每个字符数转换为7位数字并创建数组,然后将此数组的每个8位封装并解释为字节。

要查看来自 ASCI 的字符并从中选择 128 个字符(这是任意的),我在控制台中键入

[...Array(256)].map((x,i) => String.fromCharCode(i)).join('');

我尽量避免使用在不同上下文中具有“特殊含义”的字符,例如 ! @# $ % ' & ...

这里是 working example(将 Float32Array 转换为 json)。

在 Chrome、Firefox 和 Safari 上测试

结论

将字节数组转换为 base128 字符串(这是有效的 json)后,输出字符串小于输入数组的 15%

更新

再深入一点,发现当我们发送代码大于 128 的字符时 (¼½ÀÁÂÃÄ...) 然后 chrome 实际上发送两个字符(字节)而不是一个 :( - 我以这种方式进行了测试:输入网址栏 chrome://net-internals/#events(并发送 POST 请求)和 URL_REQUEST> HTTP_STREAM_REQUEST > UPLOAD_DATA_STREAM_INIT > total_size 我们看到当正文包含大于 128 的字符女巫代码时,请求会大两倍。所以实际上我们发送这些字符没有任何好处 :( 。对于 base64 字符串,我们没有观察到这种负面行为 - 但是我离开了这个程序因为它们可能会用于发送以外的其他目的(比如在 localstorage 中比 base64 更好地替代存储二进制数据——但可能存在更好的方法......?)。UPDATE 2019 here

关于javascript - 将字节数组转换为 base128 有效的 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com