2

我想写一些 ID 用于Crockford 的 base32中的 URL 。我正在使用base32 npm 模块

因此,例如,如果用户输入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 映射到同一个东西?

4

3 回答 3

3

对于传入的请求,您需要解码URL 片段。创建 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 编码的维基百科页面是一个很好的资源。

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

你如何编码标识符取决于你的标识符是如何生成的。你没有说你是如何生成底层标识符的,所以我不能对你应该如何处理来自解码器的原始字节做出任何假设,也不能对传递给编码器的原始字节的内容做出任何假设。

同样重要的是要提到您链接到的库与 Crockford 的 Base32 编码不兼容。该库不包括I, L, O, S,而 Crockford 的编码不包括I, L, O, U. 如果您尝试与使用不同库的另一个系统进行互操作,这将是一个问题。如果除了您之外没有人需要解码您的 URL 片段,那么互操作性就无关紧要了。

于 2013-12-02T22:42:52.307 回答
0

JavaScript 有

parseInt(数字,32)

num.toString(32)

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

于 2013-09-04T20:52:56.857 回答
0

您混淆的根源在于 base64 或 base32 是表示数字的方法 - 而您在示例中尝试对文本字符串进行编码或解码。

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

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

于 2012-11-09T04:42:04.530 回答