0

这更像是一个普遍的问题,而不是一个特定于 ruby​​ 的问题,我只是碰巧在 ruby​​ 中做这件事。我正在尝试使用例如 Base62 (0-9a-zA-Z) 的字符集将字符串转换为 Integer/Long/Bigint 或任何您想调用的字符串。

问题是当我尝试将像“0ab”这样的字符串转换为整数并将该整数转换回字符串时,我得到“ab”。任何以字母表的第一个字符开头的字符串都会发生这种情况。

这是一个示例实现,具有相同的问题。

https://github.com/jtzemp/base62/blob/master/lib/base62.rb

在行动:

2.1.3 :001 > require 'base62'
 => true
2.1.3 :002 > Base62.decode "0ab"
 => 2269 
2.1.3 :003 > Base62.encode 2269
 => "ab"

我可能错过了明显的。

如果没有那个例外,我怎样才能双向转换?

4

1 回答 1

1

你说得对,这是一个更普遍的问题。

一种解决方案是使用“填充”,它填充额外的信息,例如指示丢失的位,或者不是完全干净的转换。

例如,在您的特定代码中,如果它是第一个原语,您当前正在丢失前导字符。这是因为前导字符的索引为零,并且您将零添加到您的 int 中,这不会改变任何内容。

在您的代码中,可以通过多种方式完成填充。

例如,添加一个不是第一个原语的给定前导字符。

本质上,你需要选择一种方式来保护零值,这样它就不会被 int 丢失。

另一种解决方案是将存储从使用 int 更改为使用不会丢失前导零的任何其他对象,例如字符串。这就是典型的 Base64 编码类的做法:输入是字符串,存储也是字符串。

于 2014-10-12T16:06:01.077 回答