Using hex with char?

Started by
4 comments, last by ApochPiQ 10 years, 5 months ago

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.

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

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

EckTech Games - Games and Unity Assets I'm working on
Still Flying - My GameDev journal
The Shilwulf Dynasty - Campaign notes for my Rogue Trader RPG

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".

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

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

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

Check out my open source code projects/libraries! My Homepage You may learn something.
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.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

This topic is closed to new replies.

Advertisement