这是一个普遍的问题,而不是特定于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"
我可能会错过显而易见的事情。
如何在没有该例外的情况下双向转换?
答案 0 :(得分:1)
您认为这是一个更普遍的问题。
一种解决方案是使用" padding",它填充额外的信息,例如指示丢失的位,或者转换不是非常完美的。
例如,在您的特定代码中,如果它是第一个原语,那么您当前正在丢失主角。这是因为前导字符的索引为零,并且您将零添加到您的int,这不会改变任何内容。
在您的代码中,填充可以通过多种方式完成。
例如,在前面添加不是第一个原语的前导字符。
基本上,你需要选择一种保护零值的方法,因此int不会丢失它。
另一种解决方案是将存储从使用int更改为使用不会丢失前导零的任何其他对象,例如字符串。这就是典型的Base64编码类的作用:输入是一个字符串,存储也是一个字符串。