Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Encode as alphanumeric

Reply
Thread Tools

Encode as alphanumeric

 
 
Trans
Guest
Posts: n/a
 
      03-26-2008
Hi,

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?

Thanks,
T.

 
Reply With Quote
 
 
 
 
Sean O'Halpin
Guest
Posts: n/a
 
      03-26-2008
On Wed, Mar 26, 2008 at 8:13 PM, Trans <(E-Mail Removed)> wrote:
> Hi,
>
> 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?
>
> Thanks,
> T.
>

Here's one way:

require 'base64'

str = Base64.encode64('\0\1')
# => "XDBcMQ==\n"
Base64.decode64(str)
# => "\\0\\1"

HTH
Sean

 
Reply With Quote
 
 
 
 
MenTaLguY
Guest
Posts: n/a
 
      03-26-2008
On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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?

-mental


 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      03-26-2008


On Mar 26, 4:27 pm, MenTaLguY <(E-Mail Removed)> wrote:
> On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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].

T.

 
Reply With Quote
 
t3ch.dude
Guest
Posts: n/a
 
      03-26-2008
On Mar 26, 4:44*pm, Trans <(E-Mail Removed)> wrote:
> On Mar 26, 4:27 pm, MenTaLguY <(E-Mail Removed)> wrote:
>
> > On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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].
>
> T.


How about a proper subset [a-f0-9] ?

irb(main):001:0> readable = "\0\1ALf\3=".unpack('H*')
=> ["0001414c66033d"]
irb(main):002:0> original = readable.pack('H*')
=> "\000\001ALf\003="

-T3ch.dude
 
Reply With Quote
 
MenTaLguY
Guest
Posts: n/a
 
      03-26-2008
On Thu, 27 Mar 2008 05:44:12 +0900, Trans <(E-Mail Removed)> wrote:
> On Mar 26, 4:27 pm, MenTaLguY <(E-Mail Removed)> wrote:
>> On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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.

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.

-mental


 
Reply With Quote
 
F. Senault
Guest
Posts: n/a
 
      03-26-2008
Le 26 mars 2008 à 21:44, Trans a écrit :

> On Mar 26, 4:27 pm, MenTaLguY <(E-Mail Removed)> wrote:
>> On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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.


How long is your key ? If it's relatively short, you could use the
mechanism described in the RFC 1760 (S/KEY), which shows a method to
converts a number into a group of 6 small words.

| 0: 3D8B BA84 B4A5 E7E2
| 1: 5F2A 00BE DCF1 E6AD

Becomes :

| 0: SOP BOUT JESS COED BRAG TURF
| 1: BRIM AWAY OR MELT IRE BESS

(It's used in the OPIE implementations on some *nix systems ; on
FreeBSD, I made the above with azertyuiop as a passphrase and

| 22:46 fred@balvenie:~> opiekey -x -n 5 1 zb78774
| 22:46 fred@balvenie:~> opiekey -n 5 1 zb78774

Fred
--
Error: No applicable methods for #<STANDARD-GENERIC-FUNCTION CLOS:SLOT-
VALUE-USING-CLASS 506F939A> with args (#<BUILT-IN-CLASS NULL 5072054C>
NIL ADDRESS) Sorry, what is this "wife" thing? Is it related to the
rumoured existence of something called "life" ? (Arvid Grøtting, SDM)
 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      03-26-2008


On Mar 26, 5:24 pm, "t3ch.dude" <(E-Mail Removed)> wrote:

> irb(main):001:0> readable = "\0\1ALf\3=".unpack('H*')
> => ["0001414c66033d"]
> irb(main):002:0> original = readable.pack('H*')
> => "\000\001ALf\003="


Concise, but the resulting string is longer than I would prefer.

Thanks though,
T.

 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      03-26-2008


On Mar 26, 5:33 pm, MenTaLguY <(E-Mail Removed)> wrote:
> On Thu, 27 Mar 2008 05:44:12 +0900, Trans <(E-Mail Removed)> wrote:
> > On Mar 26, 4:27 pm, MenTaLguY <(E-Mail Removed)> wrote:
> >> On Thu, 27 Mar 2008 05:13:23 +0900, Trans <(E-Mail Removed)> 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.

 
Reply With Quote
 
ara.t.howard
Guest
Posts: n/a
 
      03-27-2008

On Mar 26, 2008, at 3:33 PM, MenTaLguY wrote:
> I see. Base 62 then?


you know that would really be quite useful - base64 has the ultra
annoying property that it includes '/' which breaks urls unless
encoded/decoded.

cheers.

-a
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama





 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
regex debugging: alphanumeric with dashes enrique Java 2 05-19-2005 03:27 AM
Alphanumeric font dereklai2k@yahoo.com.hk Java 2 12-17-2004 12:23 PM
Check if var is alphanumeric? VB Programmer ASP .Net 2 11-16-2004 06:46 PM
Natural sorting order for alphanumeric fields Paul Java 1 09-14-2004 12:41 PM
Easy way to specify all non-alphanumeric characters? Steven J Sobol Java 8 04-30-2004 09:15 AM



Advertisments