Bug in base64 encoder

3 messages Options
Embed this post
Permalink
Jann Röder-2

Bug in base64 encoder

Reply Threaded More More options
Print post
Permalink
Hello,
I am using the gobo base64 encoder to encode the managed_pointer output
generated by the SED serializer. And now I found a strange bug. In some
cases encoding and decoding of a storable works and in others it
doesn't. The decoded string is one byte too short. In the example below
the encoding and decoding of the array <<"hello", "world">> doesn't
work, while the array <<"">> can be decoded just fine.

This is the example code that reproduces the problem:

test_base_64_serialization_report is
                -- Test the base64 encoder
        local
                l_ptr, l_ptr2: MANAGED_POINTER
                l_array: ARRAY[STRING]
                l_facilities: SED_STORABLE_FACILITIES
                l_rw: SED_MEMORY_READER_WRITER
                l_i: INTEGER
                l_str, l_out_str: STRING
                l_blob_string: UC_UTF8_STRING
                l_encoder: UT_BASE64_ENCODING_OUTPUT_STREAM
                l_input_stream: KL_STRING_INPUT_STREAM
                l_decoder: UT_BASE64_DECODING_INPUT_STREAM
        do
                create l_facilities
                create l_rw.make

                l_array := << "hello", "world" >>
                --l_array := <<"">>

                l_facilities.independent_store (l_array, l_rw, True)
                l_ptr := l_rw.data

                -- Encode
                create l_blob_string.make (1000)
                create l_encoder.make (l_blob_string, False, False)
                from
                        l_i := 0
                until
                        l_i >= l_ptr.count
                loop
                        l_encoder.put_character (l_ptr.read_character (l_i))
                        l_i := l_i + 1
                end
                l_str := l_blob_string.to_utf8

                -- Decode
                create l_input_stream.make (l_str)
                create l_decoder.make (l_input_stream)
                from
                        create l_out_str.make (l_str.count)
                until
                        l_decoder.end_of_input
                loop
                        l_decoder.read_string (l_str.count)
                        l_out_str.append (l_decoder.last_string)
                end
                create l_ptr2.make_from_pointer (l_out_str.area.base_address,
l_out_str.count)
                check
                        l_ptr ~ l_ptr2
                end
        end

Thanks,
Jann

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
gobo-eiffel-develop mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop
Jann Röder-2

Re: Bug in base64 encoder

Reply Threaded More More options
Print post
Permalink
Ok,
this was my fault. I forgot to call close on the encoder.
Sorry about that.

Jann

Jann Röder schrieb:

> Hello,
> I am using the gobo base64 encoder to encode the managed_pointer output
> generated by the SED serializer. And now I found a strange bug. In some
> cases encoding and decoding of a storable works and in others it
> doesn't. The decoded string is one byte too short. In the example below
> the encoding and decoding of the array <<"hello", "world">> doesn't
> work, while the array <<"">> can be decoded just fine.
>
> This is the example code that reproduces the problem:
>
> test_base_64_serialization_report is
> -- Test the base64 encoder
> local
> l_ptr, l_ptr2: MANAGED_POINTER
> l_array: ARRAY[STRING]
> l_facilities: SED_STORABLE_FACILITIES
> l_rw: SED_MEMORY_READER_WRITER
> l_i: INTEGER
> l_str, l_out_str: STRING
> l_blob_string: UC_UTF8_STRING
> l_encoder: UT_BASE64_ENCODING_OUTPUT_STREAM
> l_input_stream: KL_STRING_INPUT_STREAM
> l_decoder: UT_BASE64_DECODING_INPUT_STREAM
> do
> create l_facilities
> create l_rw.make
>
> l_array := << "hello", "world" >>
> --l_array := <<"">>
>
> l_facilities.independent_store (l_array, l_rw, True)
> l_ptr := l_rw.data
>
> -- Encode
> create l_blob_string.make (1000)
> create l_encoder.make (l_blob_string, False, False)
> from
> l_i := 0
> until
> l_i >= l_ptr.count
> loop
> l_encoder.put_character (l_ptr.read_character (l_i))
> l_i := l_i + 1
> end
> l_str := l_blob_string.to_utf8
>
> -- Decode
> create l_input_stream.make (l_str)
> create l_decoder.make (l_input_stream)
> from
> create l_out_str.make (l_str.count)
> until
> l_decoder.end_of_input
> loop
> l_decoder.read_string (l_str.count)
> l_out_str.append (l_decoder.last_string)
> end
> create l_ptr2.make_from_pointer (l_out_str.area.base_address,
> l_out_str.count)
> check
> l_ptr ~ l_ptr2
> end
> end
>
> Thanks,
> Jann
>
> ------------------------------------------------------------------------------
> Enter the BlackBerry Developer Challenge  
> This is your chance to win up to $100,000 in prizes! For a limited time,
> vendors submitting new applications to BlackBerry App World(TM) will have
> the opportunity to enter the BlackBerry Developer Challenge. See full prize  
> details at: http://p.sf.net/sfu/Challenge
> _______________________________________________
> gobo-eiffel-develop mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
gobo-eiffel-develop mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop
Berend de Boer

Re: Bug in base64 encoder

Reply Threaded More More options
Print post
Permalink
In reply to this post by Jann Röder-2
>>>>> "Jann" == Jann Röder <[hidden email]> writes:

    Jann> This is the example code that reproduces the problem:

Let me just say this type prefixing looks awful.

What are you going to do when the type changes?

--
Cheers,

Berend de Boer

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
gobo-eiffel-develop mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop