将十六进制(或base64)输入编码为base32输出,将base32输入解码为hex/base64-寻找Javascript解决方案
我在JS中遇到了一个不错的base64编码实现,它的典型工作是接受utf8编码的文本输入并给出base64输出(反之亦然)。但我很惊讶,我从来没有看到一个适合base32的解决方案!好吧,这就是我所发现的:将十六进制(或base64)输入编码为base32输出,将base32输入解码为hex/base64-寻找Javascript解决方案,javascript,encoding,base64,base32,Javascript,Encoding,Base64,Base32,我在JS中遇到了一个不错的base64编码实现,它的典型工作是接受utf8编码的文本输入并给出base64输出(反之亦然)。但我很惊讶,我从来没有看到一个适合base32的解决方案!好吧,这就是我所发现的: 1.这是针对NodeJ的,其主base32.encode函数将输入作为字符串。 2.这也将输入作为字符串。此外,这还缺少解码器。 但是我需要脚本将输入作为十六进制(甚至是base64)!!!如果我的输入是十六进制,那么输出将被缩短;如果我的输入是base64,那么根据,输出将是20%的超大尺
1.这是针对NodeJ的,其主base32.encode函数将输入作为字符串。
2.这也将输入作为字符串。此外,这还缺少解码器。
但是我需要脚本将输入作为十六进制(甚至是base64)!!!如果我的输入是十六进制,那么输出将被缩短;如果我的输入是base64,那么根据,输出将是20%的超大尺寸-这就是我所期望的。
给出字母“abcdefghijklmnopqrstuvxyz234567”: 我希望看到javascript
hextobase32(“12AB3412AB3412AB3412AB34”)
yieldingCKVTIEVLGQJKWNASVM2A===和base32tohex(“CKVTIEVLGQJKWNASVM2A===”
返回12AB3412AB3412AB3412AB34
更新除此之外,它似乎无法处理填充问题,我还遇到了以下libs:
1.根据,有两种编码方式:8位和7位。这个库甚至有一个选项
dataBits
(可能它只针对base64,不针对base32,我不知道)来选择8位或7位方式!但这个项目根本没有进展。还有一件事:阅读评论,我发现这个库也有填充问题2.这个库决定携带整个字节表进行解码。您可以在源代码中看到这个有趣的注释:
/*一个字节一个字节不如五个字节一个五个字节漂亮,但是测试了一点 更快。将不得不重新访问*/
但不是进化。
3.以所谓的方式运作。似乎完成了这项工作,但由于其代码非常混乱,我甚至不知道如何定义自定义字母表。
现在,我认为一个功能全面、质量可靠的Javascript UTF8/hex/base32/base64库是很好的,但目前的情况是可疑的。第一个node.js以二进制字符串形式输入,您需要的是以base-16或base-64形式输入。既然你已经 有很好的base-64实现,base16解码器非常简单,我想你已经准备好了 也适用于开箱即用的浏览器 所以您可以在浏览器中这样使用它:
var result = base32.encode(base64decode(base64input));
var result2 = base32.encode(base16decode(base16input));
var result3 = base32.encode(binaryInput);
其中base16解码
:
function base16decode( str ) {
return str.replace( /([A-fa-f0-9]{2})/g, function( m, g1 ) {
return String.fromCharCode( parseInt( g1, 16 ));
});
}
对不起,我不明白。Base32编码数据必须短于十六进制数据!但使用agnoster-base32测试此代码:
alert(base32.encode(“12AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB34”)
,看看“64t42ghk6grk4ga26cu32cj188tk8c9j85136d1h690m4ctm64t42ghk6grk4ga26cu32cj188tk8c9j85136d0”,它更大,因为编码函数没有以二进制数据的形式获取输入(参见agnoster-base32脚本源代码中的this.readByte=function(byte){if(typeof byte=='string')byte=byte.charCodeAt(0)…}
part)@lyricallywicked请看……等等,这应该是一个十六进制字符串吗?我回答的全部要点是在传递base 16输入之前使用base 16解码……在本例中,base32.encode(“12AB3412AB34”)
导致了Base32:64t42ghk6grk4ga26cu0
。这意味着数据没有被当作二进制,但我希望输入是十六进制的!@lyricallywicked第三次,base16在传递到Base32编码之前对其进行解码。我稍后会深入研究,但我看到您使用parseInt
。我不喜欢它。请告诉我,这段代码行吗使用任意大小的字符串,如下所示:base32.encode(base16解码(“12AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB3412AB34”)
,结果会是什么样子?
function base16decode( str ) {
return str.replace( /([A-fa-f0-9]{2})/g, function( m, g1 ) {
return String.fromCharCode( parseInt( g1, 16 ));
});
}