Trans
3/26/2008 9:58:00 PM
On Mar 26, 5:33 pm, MenTaLguY <men...@rydia.net> wrote:
> On Thu, 27 Mar 2008 05:44:12 +0900, Trans <transf...@gmail.com> wrote:
> > On Mar 26, 4:27 pm, MenTaLguY <men...@rydia.net> wrote:
> >> On Thu, 27 Mar 2008 05:13:23 +0900, Trans <transf...@gmail.com> wrote:
> >> > I need to take an arbitrary byte string and encode it as alphanumeric
> >> > (and decode it back again). Any pointers on a easy way to do this?
>
> >> What sort of encoding do you have in mind? Hexadecimal? Base64?
>
> > I'm using a two-way encryption algorithm to create a registration key.
> > The encryption algorithm produces an arbitrary byte string. I need to
> > encode that into something I can give to a end-user, ie. an
> > alphanumeric string.
>
> > Base64 is close but not quite [a-zA-Z0-9].
>
> I see. Base 62 then? The most direct way is to get things as a bignum
> and then convert bases using divmod.
>
> DIGIT_CHARS = ["0".."9", "a".."z", "A".."Z"].map { |r| r.to_a }.flatten
> BASE = DIGIT_CHARS.size
> DIGIT_VALUES = Hash[*(0...BASE).map { |i| [ DIGIT_CHARS[i], i ] }.flatten]
>
> def convert_base(digits, from_base, to_base)
> bignum = 0
> digits.each { |digit| bignum = bignum * from_base + digit }
> converted = []
> until bignum.zero?
> bignum, digit = bignum.divmod to_base
> converted.push digit
> end
> converted.reverse
> end
>
> def encode(byte_string)
> convert_base(byte_string.unpack("C*"), 256, BASE).map { |d|
> DIGIT_CHARS[d]
> }.join('')
> end
>
> def decode(encoded)
> convert_base(encoded.split('').map { |c|
> DIGIT_VALUES[c]
> }, BASE, 256).pack("C*")
> end
>
> There are more efficient ways of accomplishing this, of course.
This is perfect for my needs. Thank you.
> Note that with this implementation, you'd probably want to zero-fill to
> whatever standard number of characters and bytes you're using, and of
> course a key of all zeroes will result in an empty string.
>
> As a usability thing, I'd also suggest non-uniformly adding dashes or
> spaces in standard places to the encoded form, to help users visually
> "chunk" the keys if they ever might have to type them in.
Cool.
Thanks again mental,
T.