我想使用JSON发送大字节数组启发了我,为了减少开销,我想使用base128编码(实际上可以产生有效的json字符串)。但不幸的是,我无法找到一些在JS中进行转换的过程。我将发布过程作为对此问题的答案,但是可能是某人的过程更短,或者可能是在JSON中有效发送二进制数据的更好的主意。
编码
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
功能-这里。这里的掩盖思想是将字节数组转换为位数组,然后将每7位(值从0到127)作为字符编号icharakter list c
。在解码中,我们将每个字符数更改为7位数字并创建数组,然后将每个8位数据包打包为该数组,并将其解释为字节。
要查看ASCI中的字符并从中选择128个(任意),请在控制台中键入
[...Array(256)].map((x,i) => String.fromCharCode(i)).join('');
我尽量避免在不同的上下文中具有“特殊含义”的字符 ! @ # $ % ' & ...
这是工作示例(转换Float32Array
为json)。
在Chrome,Firefox和Safari上测试
将bytes数组转换为base128字符串(有效的json)后,输出字符串小于15%
输入数组。
多挖一点,然后暴露出来,当我们发送代码大于128(¼½ÀÁÂÃÄ...
)的字符时,chrome实际上发送了两个字符(字节),而不是一个:(-我以这种方式进行测试:在网址栏中输入
chrome: // net-internals /#events (并发送POST请求),并在 _URL_REQUEST >
HTTP_STREAM_REQUEST> UPLOAD_DATA_STREAM_INIT>
total_size中_我们看到当正文包含大于128的字符字符时,请求的大小是原来的两倍。因此,实际上,发送此字符:(我们没有收益。对于base64字符串,我们没有观察到这种负面行为-
但是我离开了此过程,因为它们可能会被用于发送以外的其他目的(例如比base64更好的替代localstorage中的存储二进制数据的方式-
但是可能存在更好的方法…?)。
问题内容: 我具有来自Web服务的以下JSON字符串,并且正在尝试将其转换为 我在线上对此进行了验证,这似乎是正确的。现在我在android开发中使用以下代码来利用 这会引发异常和类型不匹配的异常。 问题答案: 在这里,您将获得JSONObject,因此请更改以下行: 具有以下内容: 之后
问题内容: 我有一个要加密的字节数组,然后转换为字符串,以便可以传输。当我收到字符串时,我必须将字符串转换回字节数组,以便可以对其进行解密。我检查了接收到的字符串是否与发送的字符串(包括长度)匹配,但是当我使用诸如str.getBytes()之类的东西将其转换为字节数组时,它与我的原始字节数组不匹配。 示例输出: 任何想法如何将接收到的字符串转换为与发送的字节数组匹配的字节数组? 谢谢 问题答案:
问题内容: 假设我有一个4字符串,并且我想将此字符串转换为字节数组,其中字符串中的每个字符都转换为等效的十六进制。例如 我正在尝试让我的输出成为 有没有简单的方法可以做到这一点? 问题答案: 编码功能可以为您提供帮助,编码返回字符串的编码版本 或者你可以使用数组模块
问题内容: 我有以下代码,我试图通过测试,但似乎无法理解Java世界中各种编码形式。 我想我的问题是:将任意字节的字节数组转换为Java字符串,然后将同一Java String转换为另一个字节数组的正确方法是什么,该字节数组将具有与原始字节相同的长度和相同的内容数组? 问题答案: 尝试特定的编码: ideone链接
问题内容: 我有一个无效的json字符串,如下所示, 我尝试使用JSON.parse将其转换为对象。但是,这不是有效的json字符串。是否有任何函数可以将这种无效格式转换为有效的json字符串或直接转换为对象? 问题答案: 如果您的示例语法与真实JSON相同,则JSONLint表示您需要对名称和值使用双引号。 仅在这种情况下,请使用以下替换调用: 但是,您首先应该尝试使用有效的Json。