Jump to content
  • Advertisement
Sign in to follow this  
ajm113

Using hex with char?

This topic is 2074 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!