Base64 multiple by 4

Hello,

I'm in the need of a Base64 decoding method that can decode a string
multiplied by 4. At the current moment I have the following method:

    def decode(encoded)
      if not encoded.length % 12 == 0
        raise BadInputError,
          "can only decode strings which are a multiple of 4
characters."
      end

      decoded = String.new

      k = -1
      while (k < encoded.length - 1) do
        right = 0
        left = 0

        (0..5).each do |i|
          k = k + 1
          right |= encoding_characters.index(encoded[k]) << (i * 6)
        end

        (0..5).each do |i|
          k = k + 1
          left |= encoding_characters.index(encoded[k]) << (i * 6)
        end

        (0..3).each do |i|
          decoded += ((left & (0xFF << ((3 - i) * 8))) >> ((3 - i) *
8)).chr
        end

        (0..3).each do |i|
          decoded += ((right & (0xFF << ((3 - i) * 8))) >> ((3 - i) *
8)).chr
        end
      end

      return decoded
    end

What I need (to be exact) is a ruby port of the encode/decode method
from
http://www.koders.com/java/fid2B76F86B8F8FF984EFE3C04AC6DE198E40D8EF41.aspx

Thanks in advance.

···

--
Posted via http://www.ruby-forum.com/.

aaaa aaaaaaaaaaa wrote:

          "can only decode strings which are a multiple of 4
characters."

Ignore that string.

···

--
Posted via http://www.ruby-forum.com/\.

aaaa aaaaaaaaaaa wrote:

Hello,

I'm in the need of a Base64 decoding method

Are you looking for
string.unpack("m*").first
?

http://ruby-doc.org/core/classes/String.html#M000760

···

--
Posted via http://www.ruby-forum.com/\.

irb(main):001:0> s = ["hello world"].pack("m")
=> "aGVsbG8gd29ybGQ=\n"
irb(main):002:0> s.unpack("m").first
=> "hello world"

···

--
Posted via http://www.ruby-forum.com/.

Hi,

require 'base64'
...
decoded = Base64.decode64(string)

should do the trick

Elise

···

On Wed, Aug 18, 2010 at 3:35 AM, Paul Harrington <xeno@badenoughdu.de> wrote:

aaaa aaaaaaaaaaa wrote:

Hello,

I'm in the need of a Base64 decoding method

Are you looking for
string.unpack("m*").first
?

class String - RDoc Documentation
--
Posted via http://www.ruby-forum.com/\.

Brian Candler wrote:

irb(main):001:0> s = ["hello world"].pack("m")
=> "aGVsbG8gd29ybGQ=\n"
irb(main):002:0> s.unpack("m").first
=> "hello world"

Once again, that's what not I wanted. Heres an example of what I wanted
(and now have):

RBase64.charset = (20..84).map(&:chr).join

=> "\x14\x15\x16\x17\x18\x19\x1A\e\x1C\x1D\x1E\x1F
!\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST"

RBase64.encode "my secret string"

=> "/+840J)70:)H\x1C\e!H0:9B-D=="

RBase64.decode "/+840J)70:)H\x1C\e!H0:9B-D=="

=> "my secret string"

···

--
Posted via http://www.ruby-forum.com/\.

aaaa aaaaaaaaaaa wrote:

Brian Candler wrote:

irb(main):001:0> s = ["hello world"].pack("m")
=> "aGVsbG8gd29ybGQ=\n"
irb(main):002:0> s.unpack("m").first
=> "hello world"

Once again, that's what not I wanted.

Then you need to specify more precisely what you want.

At a glance, the Java code you linked to implements a perfectly standard
Base64 encoding (although I've not attempted to run it), which is why I
gave the Ruby equivalent. You're saying it doesn't? What does it
implement then?

"decode a string multiplied by 4" doesn't really mean anything by
itself. The Java code appears to take groups of 3 bytes and turns them
into 4 characters, as Base64 does.

Heres an example of what I wanted
(and now have):

RBase64.charset = (20..84).map(&:chr).join

=> "\x14\x15\x16\x17\x18\x19\x1A\e\x1C\x1D\x1E\x1F
!\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST"

RBase64.encode "my secret string"

=> "/+840J)70:)H\x1C\e!H0:9B-D=="

RBase64.decode "/+840J)70:)H\x1C\e!H0:9B-D=="

=> "my secret string"

Test vectors are certainly useful.

Now, can you describe the encode/decode algorithm you're implementing,
other than by means of your existing Ruby code? (Incidentally, you've
only shown your decode method so far, not the encode)

What character set are you using in the encoded string? Why are the
unprintable characters \x1C and \e in there?

···

--
Posted via http://www.ruby-forum.com/\.

Also, I tried to run the code you posted with the decode test vector,
but it fails because encoding_characters is not defined.

If all you're doing is base64 with some obfuscated character set, then
String#tr may do what you want.

str = "foobar"

=> "foobar"

str.tr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", "V8yOtbKFR4mIDuwEzP7Mv/TLQSe+qC6aHkolZ50dG2jAUpWxh1J3N9YsBiXrcgfn")

=> "aGG+eA"

···

--
Posted via http://www.ruby-forum.com/\.