Valhalla Legends Archive

Programming => Battle.net Bot Development => Topic started by: Sorc.Polgara on December 13, 2004, 06:09 PM

Title: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Sorc.Polgara on December 13, 2004, 06:09 PM
I've tried several things that I thought that might work, but I don't think they do.
Here is my DebufDWORD() function

DWORD debuffer::DebufDWORD()
{
DWORD debDWORD;
char remDWORD[sizeof(DWORD)];

memcpy(remDWORD, debuf + pos, 4);
        debDWORD = *remDWORD

return debDWORD;
}

now it only seems to be converting the first character of the 4 byte, 4 char string.  It seems logical enough, however if you can turn a DWORD into a 4 byte string, then you should be able to turn a 4 byte string or 4 char string into a DWORD.
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: shadypalm88 on December 13, 2004, 06:16 PM
Quote from: Sorc.Polgara on December 13, 2004, 06:09 PM
I've tried several things that I thought that might work, but I don't think they do.
Here is my DebufDWORD() function

DWORD debuffer::DebufDWORD()
{
DWORD debDWORD;
char remDWORD[sizeof(DWORD)];

memcpy(remDWORD, debuf + pos, 4);
        debDWORD = *remDWORD

return debDWORD;
}

now it only seems to be converting the first character of the 4 byte, 4 char string.  It seems logical enough, however if you can turn a DWORD into a 4 byte string, then you should be able to turn a 4 byte string or 4 char string into a DWORD.
Looks like you're thinking in VB.

DWORD debuffer::DebufDWORD() {
DWORD dwTemp = *(DWORD*) (debuf + pos);
pos += sizeof(DWORD);
return dwTemp;
}
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Mephisto on December 13, 2004, 07:04 PM
If you just want to convert a string to a DWORD use: static_cast<DWORD>(atoi(theStringToBeConverted)); and same with a word with a static cast of type WORD.  Code is untested, but even if it doesn't work you should still be able to figure something out.  Also, you can't convert a string to type BYTE (BYTE is typedef unsigned char BYTE).  It's a single character in other words, so it doesn't make sense to want to take a multi-character string and convert it to BYTE, it's not possible.

Note: Using atoi() will just convert numeral characters to numerals.  If the function encounters a non-numeric character it will return 0 (IIRC).  If it doesn't, *(DWORD *)string should work.
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Adron on December 14, 2004, 01:56 AM
Quote from: Mephisto on December 13, 2004, 07:04 PM
If you just want to convert a string to a DWORD use: static_cast<DWORD>(atoi(theStringToBeConverted)); and same with a word with a static cast of type WORD.  Code is untested, but even if it doesn't work you should still be able to figure something out.  Also, you can't convert a string to type BYTE (BYTE is typedef unsigned char BYTE).  It's a single character in other words, so it doesn't make sense to want to take a multi-character string and convert it to BYTE, it's not possible.

Note: Using atoi() will just convert numeral characters to numerals.  If the function encounters a non-numeric character it will return 0 (IIRC).  If this is a problem doing (DWORD)string should work.

Doing (DWORD)string will get you the pointer value, nothing useful. You have provided flawed advice so many times that I think you should start testing your ideas before posting them.

There's no absolute need for the static_casts. For a DWORD, compilers typically manage casting an int to an unsigned int by itself just fine. The cast to word will be useful to avoid a warning. You could also use strtoul to get a DWORD from the start. If he's after what you are suggesting, converting to a BYTE would make perfect sense too. Many 3 digit strings can be turned into a BYTE just fine. It handles values up to 255...

However, given what Sorc.Polgara has been up to before, I find it doubtful that converting digits is the wanted solution. Luckily shadypalm88 has already provided something that works for a packet buffer. I'll just add the memcpy version:


DWORD debDWORD;
memcpy(&debDWORD, debuf + pos, 4);
pos += 4;
return debDWORD;


And then we can all ignore that irrelevant post of yours (which would've been better not posted at all?).
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Mephisto on December 14, 2004, 09:05 AM
Then delete it *shrug*
And maybe you should point out my irrelevant suggestions?  I made one blatantly bad statement and you say that I provide irrelevant advice on a regualar basis?  I'm sorry I make mistakes and no one tells me...
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: MyndFyre on December 14, 2004, 11:32 AM
Quote from: Mephisto on December 14, 2004, 09:05 AM
Then delete it *shrug*
And maybe you should point out my irrelevant suggestions?  I made one blatantly bad statement and you say that I provide irrelevant advice on a regualar basis?  I'm sorry I make mistakes and no one tells me...

Looking at what was said, I believe Adron was speaking to Eibro, who had said:

Well nevermind, the post of him complaining that it was deleted was also deleted.  But I remember thinking that Adron was talking to Eibro, not you Mephisto.
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Mephisto on December 14, 2004, 01:58 PM
Thought he was talking to me since he was describing my post (static cast, etc.).
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Eibro on December 14, 2004, 03:11 PM
Quote from: MyndFyre on December 14, 2004, 11:32 AM
Quote from: Mephisto on December 14, 2004, 09:05 AM
Then delete it *shrug*
And maybe you should point out my irrelevant suggestions?  I made one blatantly bad statement and you say that I provide irrelevant advice on a regualar basis?  I'm sorry I make mistakes and no one tells me...

Looking at what was said, I believe Adron was speaking to Eibro, who had said:

Well nevermind, the post of him complaining that it was deleted was also deleted.  But I remember thinking that Adron was talking to Eibro, not you Mephisto.
He couldn't have been talking to me. The answer I provided was correct. Here, I'll post it again. DWORD data = *(DWORD*)charbuf;

There is nothing wrong with that. Nor was there with my n previous posts. If someone has a problem with me i'd appreciate if they told me.
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Mephisto on December 14, 2004, 05:34 PM
Bleh, forgot to do do the pointer deferencing with my typecast.  :\
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: OnlyMeat on December 14, 2004, 05:44 PM
Quote from: Sorc.Polgara on December 13, 2004, 06:09 PM
I've tried several things that I thought that might work, but I don't think they do.
Here is my DebufDWORD() function

DWORD debuffer::DebufDWORD()
{
DWORD debDWORD;
char remDWORD[sizeof(DWORD)];

memcpy(remDWORD, debuf + pos, 4);
        debDWORD = *remDWORD

return debDWORD;
}

now it only seems to be converting the first character of the 4 byte, 4 char string.  It seems logical enough, however if you can turn a DWORD into a 4 byte string, then you should be able to turn a 4 byte string or 4 char string into a DWORD.

There are a few mistakes you are making here, firstly you dont need to use an intermediate char array for extracting a dword from your buffer try this instead:-


DWORD dwResult;
memcpy( &dwResult, debuf + pos, sizeof(DWORD) );


The second problem is related to the first in the fact that there is no built in binary '=' operator in c++ for copying the contents of a char array to a DWORD therefore this expression will just copy the first element in the array to the dword:-


        debDWORD = *remDWORD


so a corrected version of your code could be represented as follows:-


DWORD debuffer::DebufDWORD()
{
DWORD dwResult;
memcpy( &dwResult, debuf + pos, sizeof(DWORD) );

return dwResult;
}


These are common mistakes when one tries to learn c++, continue the good work!
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Zakath on December 14, 2004, 06:26 PM
I agree with Eibro...there's no need to involve memcpy. Just dereference the pointer and copy by value...
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: tA-Kane on December 15, 2004, 01:58 PM
if you don't like using pointers and all that, you can use a simple union.

typedef union {
  DWORD dwValue;
  char cValue[5];
} DWORDConverter;

int main(void){
  DWORDConverter Converter;
 
  Converter.dwValue = 'IX86';
  Converter.cValue[4] = 0;//need null byte to end the cstr
  printf("%s", Converter.cValue);
  return 0;
}


just an alternative to typecasting, if you're ewwy++ with pointers
Title: Re: Converting string/chars to DWORD, WORD, BYTE datatypes
Post by: Adron on December 15, 2004, 04:30 PM
Quote from: Mephisto on December 14, 2004, 01:58 PM
Thought he was talking to me since he was describing my post (static cast, etc.).

Yes, I was talking to you. You seemed to have improved there for a while, giving valid advice. And then you come here and post that?