Jump to content

  • Log In with Google      Sign In   
  • Create Account


Using hex with char?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 ajm113   Members   -  Reputation: 268

Like
0Likes
Like

Posted 16 November 2013 - 08:14 AM

I'ts been a very long time since I've had to play with C#. (Heavy C++ background.) A buddy of mine wanted me to write a library for he's project that would allow him to access this database server I've been building from scratch and I've ran into a few problems. Of course one mainly being hex values and converting them to char. I've been Googling and playing around with the code, but nothing is really working for me.

Here is a base64 encoder that I'm trying to convert to C# from C++.

 

        private static const String base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
             "abcdefghijklmnopqrstuvwxyz" +
             "0123456789+/";

        private static bool is_base64(char c) 
        {
	        if(c < 0)
	        {
		        return false;
	        }

          return (char.IsLetterOrDigit(c) || (c == '+') || (c == '/'));
        }

        String base64_encode(char[] bytes_to_encode, int in_len)
        {
              String ret;
              int i = 0;
              int j = 0;
              char[] char_array_3 = new char[3];
              char[] char_array_4 = new char[4];

              while (in_len > -1) 
              {
                 in_len--;
                char_array_3[i++] = *(bytes_to_encode++);
                if (i == 3) {
                  char_array_4[0] = (char_array_3[0] & (char)0xfc) >> 2;
                  char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
                  char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
                  char_array_4[3] = char_array_3[2] & 0x3f;


                  for(i = 0; (i <4) ; i++)
                    ret += base64_chars[char_array_4[i]];
                  i = 0;
                }
              }

              if (i > 0)
              {
                for(j = i; j < 3; j++)
                  char_array_3[j] = '\0';

                char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
                char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
                char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
                char_array_4[3] = char_array_3[2] & char(0x3f);

                for (j = 0; (j < i + 1); j++)
                  ret += base64_chars[char_array_4[j]];

                while((i++ < 3))
                  ret += '=';

              }

              return ret;

        }

Of course I'm getting the cannot convert int to char error on the lines using hex. I tried of course doing "(char)0xc0" and "unchecked((char)0x3f)". But nothing is really standing out as a answer.


Edited by ajm113, 16 November 2013 - 08:19 AM.

Check out my open source code projects/libraries! My Homepage You may learn something.

Sponsor:

#2 Eck   Members   -  Reputation: 1865

Like
1Likes
Like

Posted 16 November 2013 - 09:51 AM

I think what's going on is your shift left and shift right operators are converting the values over to an int, and then you're trying to store that into your char array. Change your code over to something like this:

char_array_4[0] = (char)((char_array_3[0] & (char)0xfc) >> 2);

- Eck



#3 Vortez   Crossbones+   -  Reputation: 2689

Like
0Likes
Like

Posted 16 November 2013 - 05:13 PM

I dunno if there's a c# equivalent(pretty sure there is), but in c++, i would do something like this:

#include "Windows.h"
#include "stdio.h"

void HexToChar(char *s, int Number)
{
    sprintf(s, "%.8x", Number);
}

int main()
{
    char s[256];
    ZeroMemory(s, 256);

    HexToChar(s, 987654);

    printf("%s\n", s);

    return 0;
}

Output: 000f1206

 

I know this is old school but, it work...

 

You can use "%.8X" for Uppercase chars.,  instead of "%.8x".


Edited by Vortez, 16 November 2013 - 05:29 PM.


#4 ApochPiQ   Moderators   -  Reputation: 14671

Like
2Likes
Like

Posted 17 November 2013 - 04:37 PM

Why waste time? The cool thing about languages like C# is that virtually all of these sorts of common problems are already solved.

#5 ajm113   Members   -  Reputation: 268

Like
0Likes
Like

Posted 17 November 2013 - 05:17 PM

I think what's going on is your shift left and shift right operators are converting the values over to an int, and then you're trying to store that into your char array. Change your code over to something like this:

char_array_4[0] = (char)((char_array_3[0] & (char)0xfc) >> 2);

- Eck

 

Thanks Eck! Worked like a charm!

 

 

Vortez and ApochPiQ, thanks for the replies, but that's not what I'm trying to accomplish at all. lol


Edited by ajm113, 17 November 2013 - 05:18 PM.

Check out my open source code projects/libraries! My Homepage You may learn something.

#6 ApochPiQ   Moderators   -  Reputation: 14671

Like
1Likes
Like

Posted 17 November 2013 - 05:28 PM

I'm going to go out on a limb and suggest that if you don't understand the order of operations involved in trivial typecasting code like this, you need to brush up on your fundamentals a bit. C# has nothing to do with it; C++ has nothing to do with it; hex literals have nothing to do with it; and the char type by itself has nothing to do with it.

Understanding the way types work and how to convert between them is core programming knowledge. Understanding compiler errors and knowing how to solve them is also a core skill.


The reason I pointed you to a solution for base-64 encoding is because I'm concerned that you're not ready to be producing things of this nature from scratch yet. As much as understanding types and error messages are central to programming well, it's even more important to recognize when you can benefit from someone else's work.

Just blindly rearranging letters in your code until it appears to work is a very bad habit to get into. I guess what I'm trying to say is you should work on understanding how your programs operate and how to use the languages you work with effectively, before biting off big projects that might be more than you're ready to chew.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS