#1 decoder not working on ARM

open
nobody
None
5
2011-06-08
2011-06-08
Anonymous
No

Due to (my guess) char being unsigned by default on ARM platforms (Symbian - Nokia E72 in my case) the decoder does not work as expected. I replaced 'char' with 'signed char' as argument to 'base64_decode_value' and 'fragment', which made it work for me.

Discussion

  • Comment has been marked as spam. 
    Undo

    You can see all pending comments posted by this user  here

    Anonymous - 2011-06-16

    Some more information about the signed vs unsigned issue http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html

     
  • Harry Rostovtsev

    Confirming bug and workaround. I am using CodeSourcery compiler for Arm Cortex M3. Decoded strings seemed to get 0x0F 0xBE appended to the tail end. Changing "char" to "signed char" works and doesn't seem to break the x86 code. Below is a diff of the changes:

    diff --git a/cdecode.c b/cdecode.c
    index 3f0d62d..7b2aad0 100755
    --- a/cdecode.c
    +++ b/cdecode.c
    @@ -7,7 +7,7 @@ For details, see http://sourceforge.net/projects/libb64

    #include <cdecode.h>

    -int base64_decode_value(signed char value_in)
    +int base64_decode_value(char value_in)
    {
    static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
    static const char decoding_size = sizeof(decoding);
    @@ -26,7 +26,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
    {
    const char* codechar = code_in;
    char* plainchar = plaintext_out;
    - signed char fragment;
    + char fragment;

    *plainchar = state_in->plainchar;

    diff --git a/cdecode.h b/cdecode.h
    index 2f65f8c..d0d7f48 100755
    --- a/cdecode.h
    +++ b/cdecode.h
    @@ -21,7 +21,7 @@ typedef struct

    void base64_init_decodestate(base64_decodestate* state_in);

    -int base64_decode_value(signed char value_in);
    +int base64_decode_value(char value_in);

    int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in);

     

Log in to post a comment.

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

JavaScript is required for this form.





No, thanks