使用Crockford的base 32来获取URL中的ID?

时间:2011-11-04 11:51:43

标签: javascript url encoding base32

我想写一些ID用于Crockford's base32中的网址。我正在使用base32 npm module

因此,例如,如果用户输入http://domain/page/4A2A我希望它映射到与http://domain/page/4a2a相同的基础ID

这是因为我想要人性化的URL,用户不必担心大写和小写字母之间或“l”和“1”之间的区别 - 他们只是得到页面他们期望。

但是我很难实现这个,主要是因为我太朦胧而无法理解编码是如何工作的。首先我试过了:

var encoded1 = base32.encode('4a2a');
var encoded2 = base32.encode('4A2A');
console.log(encoded1, encoded2);

但他们映射到不同的基础ID:

6hgk4r8 6h0k4g8

好的,也许我需要使用解码?

var encoded1 = base32.decode('4a2a');
var encoded2 = base32.decode('4A2A');
console.log(encoded1, encoded2);

不,那只是给我空字符串:

"    " 

我做错了什么,如何让4A2A和4A2A映射到同一个东西?

3 个答案:

答案 0 :(得分:2)

对于传入请求,您需要解码 URL片段。创建URL时,您将获取标识符并编码。因此,如果网址为http://domain/page/ dnwnyub46m50 ,您将获取该片段并对其进行解码。例如:

  

#> echo 'dnwnyub46m50'| base32 -d

     

my_id5

您链接的库不区分大小写,因此您可以通过以下方式获得相同的结果:

  

echo 'DNWNYUB46M50'| base32 -d

     

my_id5

在处理任何编码方案(Base-16/32/64)时,您有两个基本操作:encode,它对原始的位/字节流进行处理,decode进行处理一组编码的字节并返回原始位/字节流。 Base32编码上的Wikipedia page是一个很好的资源。

解码字符串时,会得到原始字节:可能是这些字节与ASCIIUTF-8或您尝试使用的其他编码不兼容。这就是为什么您的解码示例看起来像空格:您使用的工具无法将结果字节识别为有效字符。

如何编码标识符取决于标识符的生成方式。您没有说明如何生成基础标识符,因此我无法对如何处理解码器的原始字节进行任何假设,也不会对传递给编码器的原始字节的内容进行任何假设。

提及您链接的库与Crockford的Base32编码不兼容也很重要。该库排除了I, L, O, S,而Crockford的编码排除了I, L, O, U。如果您尝试与使用不同库的另一个系统进行互操作,则会出现问题。如果您以外没有人需要解码您的URL片段,那么互操作性无关紧要。

答案 1 :(得分:0)

你的困惑的根源是base64或base32是表示数字的方法 - 而你正试图在你的例子中编码或解码文本字符串。

将文本字符串编码和解码为base32是通过首先将字符串转换为大数字来完成的。在您编写“4a2a”和“4A2A”的第一个示例中,这些是具有两个不同数值的字符串,因此转换为具有两个不同值的编码base32数字,6hgk4r8 6h0k4g8

当你“解码”4a2a和4A2A时,你说你得到空字符串。然而,这不是真的,字符串不是空的,它们包含解码后的数字看起来像解释为字符串的内容。也就是说,它看起来没什么,因为4a2a产生了一个不可打印的角色。它是看不见的。你想要的是提供编码器号码,而不是字符串。

答案 2 :(得分:0)

JavaScript已

parseInt(num,32)

num.toString(32)

内置的方式与Java和JavaScript版本兼容。