Valhalla Legends Forums Archive | C/C++ Programming | char -> hex and hex -> char

AuthorMessageTime
Sargera
I'm currently developing DynamicBot. The bot uses a bitmask to check for user flags. Users obviously cannot interpret the bitmask in a meaningful way, so you use a flagstring so-to-speak like "ABCD." My question is how do I convert each character (flagstring[i]) into the integral-type hex equivolent? I've tried a few methods, neither of them worked, so that is why I am resorting to these boards.

Bottom line: I need to know how to convert a character ('A' 'B' 'C') into the integral-hex equivolent flag that the bot can understand as it uses a bitmask to check flags.

My constants are declared as the following as this will certainly effect the solution to the problem:
[code]#define FLAG_A 0x01
#define FLAG_B 0x02
#define FLAG_C 0x04
#define FLAG_D 0x08
#define FLAG_E 0x10
#define FLAG_F 0x20
#define FLAG_G 0x40
#define FLAG_H 0x80
#define FLAG_I 0x100
#define FLAG_J 0x200
#define FLAG_K 0x400
#define FLAG_L 0x800
#define FLAG_M 0x1000
#define FLAG_N 0x2000
#define FLAG_O 0x4000
#define FLAG_P 0x8000
#define FLAG_Q 0x10000
#define FLAG_R 0x20000
#define FLAG_S 0x40000
#define FLAG_T 0x80000
#define FLAG_U 0x100000
#define FLAG_V 0x200000
#define FLAG_W 0x400000
#define FLAG_X 0x800000
#define FLAG_Y 0x1000000
#define FLAG_Z 0x2000000[/code]
July 8, 2004, 7:22 AM
Moonshine
Unless I interpretted what you're wanting incorrectly, I don't see what the big deal is...

[code]
In a loop...

switch (toupper(flagstring[i])) {
   case 'A': HandleFlag(FLAG_A); break;
   // ...
   case 'Z': HandleFlag(FLAG_Z); break;
   default: break;
}

[/code]
July 8, 2004, 9:14 AM
Adron
1 << flagstring[i] - 'A'
July 8, 2004, 2:06 PM
Sargera
I originally had something similar to that, Adron. I'll see if your version works.

What I had before:
[code] if (pm == '+') {
for (int i = 0; i < sizeof(flags); ++i) {
char cCharFlag = flags[i];
cCharFlag = cCharFlag - 'A';
tuser_flags |= tuser_flags | (1 << cCharFlag);
}
rUserMap[tuser].flags = tuser_flags;
for (int i = 0; i <= sizeof(flags); ++i) {
flags[i] = '\0';
}
for (int i = 0; i < 26; ++i) {
if (tuser_flags & (1 << i)) {
flags += (i + 'A');
}
}[/code]

Note: That code was taken from my moduser command function.
July 8, 2004, 5:13 PM
Sargera
[quote author=Adron link=board=30;threadid=7623;start=0#msg69201 date=1089295610]
1 << flagstring[i] - 'A'
[/quote]

Your solution worked successfully, thanks. One last question, while I've tried a few ways to accomplish this, I haven't successfully been able to, how do I convert the now hex flags into a flagstring the users can understand?
July 8, 2004, 5:21 PM
Adron
[code]
char flagstring['Z' - 'A' + 2];
char *p = flagstring;
for(int bit = 0; bit <= 'Z' - 'A'; bit++)
if(flags & (1 << bit)) *p++ = bit + 'A';
*p = 0;
[/code]
July 8, 2004, 5:24 PM
Sargera
Also, instead of adding (ORing) how would I subtract flags? I'd assume taking the AND of the complemented value? I've tried, and it comes to no avail.
July 8, 2004, 6:02 PM
Adron
flags &= ~(1 << flagstring[i] - 'A');
July 8, 2004, 7:10 PM
Maddox
I thought this quite neat. I think Skywing used this for BinaryChat or ZeroBot.

[code]
// User attribute data type (32 bits)
union UserAttributes {
   struct {
      // Privileges
      unsigned A : 1;
      unsigned B : 1;
      unsigned C : 1;
      unsigned D : 1;
      unsigned E : 1;
      unsigned F : 1;
      unsigned G : 1;
      unsigned H : 1;
      unsigned I : 1;
      unsigned J : 1;
      unsigned K : 1;
      unsigned L : 1;
      unsigned M : 1;
      unsigned N : 1;
      unsigned O : 1;
      unsigned P : 1;
      unsigned Q : 1;
      unsigned R : 1;
      unsigned S : 1;
      unsigned T : 1;
      unsigned U : 1;
      unsigned V : 1;
      unsigned W : 1;
      unsigned X : 1;
      unsigned Y : 1;
      unsigned Z : 1; // 26
      // Other information
      unsigned Designated : 1;
      unsigned Operator : 1; // 28
      unsigned Reserved : 4; // 32
   };
   struct {
      unsigned Attributes : 26; // 26
      unsigned Information : 6; // 32
   };
   inline void Set(unsigned char cAttribute)
   {
      if(cAttribute < 'A' || cAttribute > 'Z')
         return;
      dwFlags |= (1 << (cAttribute - 'A'));
   }
   inline void Set(UserAttributes _Attributes)
   {
      Attributes |= _Attributes.Attributes;
   }
   inline void Remove(unsigned char cAttribute)
   {
      if(cAttribute < 'A' || cAttribute > 'Z')
         return;
      dwFlags &= ~(1 << (cAttribute - 'A'));
   }
   inline void Remove(UserAttributes _Attributes)
   {
      Attributes &= ~_Attributes.Attributes;
   }
   inline bool Check(unsigned char cAttribute) const
   {
      if(cAttribute < 'A' || cAttribute > 'Z')
         return false;
      return !!(dwFlags & (1 << (cAttribute - 'A'))); // ~~~ not 'a' gddmit ~~~
   }
   inline bool Check(UserAttributes _Attributes) const
   {
      return (Attributes & _Attributes.Attributes) == _Attributes.Attributes;
   }
   inline void Replace(UserAttributes _Attributes, bool bReplaceInformation)
   {
      if(bReplaceInformation)
         dwFlags = _Attributes.dwFlags;
      else
         Attributes = _Attributes.Attributes;
   }
   DWORD dwFlags; // 32
};
[/code]
July 8, 2004, 8:44 PM

Search