字符串到整数转换省略charset的第一个字符

时间:2014-10-12 15:30:12

标签: ruby string base62

这是一个普遍的问题,而不是特定于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"

我可能会错过显而易见的事情。

如何在没有该例外的情况下双向转换?

1 个答案:

答案 0 :(得分:1)

您认为这是一个更普遍的问题。

一种解决方案是使用" padding",它填充额外的信息,例如指示丢失的位,或者转换不是非常完美的。

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

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

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

基本上,你需要选择一种保护零值的方法,因此int不会丢失它。

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