Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将二进制数据编码为任意文本表示?_Javascript_Encoding_Binary - Fatal编程技术网

Javascript 如何将二进制数据编码为任意文本表示?

Javascript 如何将二进制数据编码为任意文本表示?,javascript,encoding,binary,Javascript,Encoding,Binary,我需要一对函数,用于将二进制数据编码为任意文本表示,并对其进行解码 假设我们有一个任意大小的阵列缓冲器: const buffer = new ArrayBuffer(1000) 然后我们定义一个十六进制“行话”,并使用它对十六进制字符串进行编码和解码: const lingo = "0123456789abcdef" const text = encode(buffer, lingo) const data = decode(text, lingo) 我的目标是定义我

我需要一对函数,用于将二进制数据编码为任意文本表示,并对其进行解码

假设我们有一个任意大小的阵列缓冲器:

const buffer = new ArrayBuffer(1000)
然后我们定义一个十六进制“行话”,并使用它对十六进制字符串进行编码和解码:

const lingo = "0123456789abcdef"

const text = encode(buffer, lingo)
const data = decode(text, lingo)
我的目标是定义我自己的base48“行话”,它省略元音以避免顽皮的单词:

const lingo = "256789bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"

const text = encode(buffer, lingo)
const data = decode(text, lingo)
我们如何创建在任意表示之间高效转换数据的算法?尽管我觉得这是一件非常基本的事情,但我很难找到资源来帮助我完成这项任务

如果你能想出任何没有任何元音的看似合理的顽皮单词,我甚至拿出了看起来像元音的数字


我在使用javascript,但我也希望了解基本原则。谢谢

流式传输一系列字节/数字并转换到另一个基的挑战是找到源字节/数字与目标字节/数字的最有效比率

为了确定最佳比率,下面的算法包含一个名为
mostEfficientChunk()
的函数,该函数将源代码基、目标代码基和最大源代码块大小作为参数。然后,此函数将源块大小从1移动到最大块大小,并确定目标数字基所需的最小字节数/位数。例如,Unit8Array的一个源,其中1个字节的范围从0到255,如果转换为基数10,则需要3个字节。在本例中,效率测量值为1/3或33.33%。然后检查2个字节的源,其范围为0-65535,需要5个字节的基数10,效率为2/5或40%。因此,当从基256转换到基10时,2字节的源块大小比1字节的块大小更有效。依此类推,直到找到小于或等于最大源块大小的最佳比率

下面的代码转储了对
mostEfficientChunk()
的评估,以便于确定最佳块大小

然后,一旦设置了块大小,源数据将被提供给“code()”,后者将源数据排队,然后如果存在足够的数据来形成块,则函数将块转换为目标基。请注意,如果源是流式传输,则可以连续调用
code()
。流结束时,必须调用
flush()
,该函数会追加表示
0
的数字,直到满足块大小,然后生成最终的目标块。请注意,最后一个块是填充的,因此必须跟踪原始源的长度以适当地调整解码

代码中有一些注释和测试用例,有助于理解编码器类是如何操作的

类编码流{
构造函数(fromBase、toBase、encode='encode',maxChunkSize=32){
assert(typeof fromBase=='string'| | typeof fromBase=='number');
assert(typeof toBase=='string'| | typeof toBase==='number');
断言(encode=='encode'| | encode=='decode');
this.encode=编码;
if(typeof fromBase=='string'){
this.fromBase=fromBase.length;
this.fromBaseDigits=fromBase;
}否则{
this.fromBase=fromBase | 0;
this.fromBaseDigits=null;
}

assert(2)如果我要创建这个算法,我将从以48为基数之前的八进制和十六进制开始:)似乎是一个有趣的数学问题…但我不太确定如何回答你的问题,除了解释不同基数的数字表示。你可以从行话开始确定基数,并相应地对二进制进行分区。然后你可以循环数据,并将每个分区映射到行话中的一个字符re可能是十六进制在线的例子。祝你好运!@dandeto-我很困惑,但到目前为止我的想法是:因为大多数“行话”在大小上不是二的幂,我认为效率是不可能的。我认为我必须选择“块大小”对于可接受的低效率,将每个块转换成一个大数字,然后用行话对该数字进行编码-块大小越大,效率越高,但任何小于块大小的缓冲区都会非常低效率-这是维基百科上的BASE64页(也可能是其他BASExx页)的一种折衷。它解释了如何将字节分割成更小的位序列,然后使用数组对这些位序列进行编码(BASE32应该可以工作,只有辅音、大写和小写)。你无法避免坏单词。许多语言没有元音(因为我们的大脑可以插入元音),我们使用1、3、0作为交替元音[我们可能会使用j、v和作为替代。因此,也许您可以找到32个ASCII非字母,这可能更好(在自动系统上,无需转录)@GiacomoCatenazzi-我很感激这个警告,但我怀疑我可能真的能够消除坏单词!首先,如问题所示,我确实已经删除了看起来像字母的数字。其次,我同意将类似坏单词的辅音拼凑在一起,因为这需要大量的想象力,坏单词没有解释出来城市也不在广泛认可的l33t中-考虑到base48“行话”我在我的问题中发表了一个问题,你能想出一些不太夸张的调皮的话吗?至少,我认为这是对Base64甚至是HEX的一个改进。“GiAcMoCasaNeZZI。陷阱音乐标题中的de>所以base46可能会更好!还有其他字母需要添加吗?这看起来很漂亮!为了哲学上的完整性,我必须问一下,因为我假设这可能会耗尽GB数据的内存:这个算法会是一个