我想写一些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映射到同一个东西?
答案 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是一个很好的资源。
解码字符串时,会得到原始字节:可能是这些字节与ASCII
,UTF-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版本兼容。