Is it okay to cast from int to unsigned char *?
-
I have a 32bit int that I'm trying to stuff into an array of bytes. Is it okay to do this? CharArray = new unsigned char [4]; CharArray = (unsigned char *)&IntegerValue ByteArray[Length-4] = CharArray[3] ByteArray[Length-3] = CharArray[2] ByteArray[Length-2] = CharArray[1] ByteArray[Length-1] = CharArray[0]
Yes it's ok (to cast from int * to unsigned char *). Also is that a typo? You overwrite the allocated CharArray... should that have been: ByteArray = new unsigned char [Length]; CharArray = (unsigned char *)&IntegerValue Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
-
Yes it's ok (to cast from int * to unsigned char *). Also is that a typo? You overwrite the allocated CharArray... should that have been: ByteArray = new unsigned char [Length]; CharArray = (unsigned char *)&IntegerValue Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
No, that's not a typo. The ByteArray is actually a different array type, but is still an array of unsigned char. If it is okay to get the IntegerValue into the unsigned char[4] then I'm okay. so... CharArray = new Unsigned Char [4]; CharArray = (unsigned char*)&IntegerValue ; That should still be fine. The 4 Unsigned Char bytes will then be populated with the bytes from the integer.
-
No, that's not a typo. The ByteArray is actually a different array type, but is still an array of unsigned char. If it is okay to get the IntegerValue into the unsigned char[4] then I'm okay. so... CharArray = new Unsigned Char [4]; CharArray = (unsigned char*)&IntegerValue ; That should still be fine. The 4 Unsigned Char bytes will then be populated with the bytes from the integer.
ChemmieBro wrote:
No, that's not a typo
In that case you have a problem :) ... CharArray = new unsigned char [4]; CharArray = (unsigned char *)&IntegerValue //<--- overwrites the pointer allocated above!! The storage has already been allocated - it is the 4 bytes used by the IntegerValue variable. You only need the second line above... CharArray = (unsigned char *)&IntegerValue; Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
-
I have a 32bit int that I'm trying to stuff into an array of bytes. Is it okay to do this? CharArray = new unsigned char [4]; CharArray = (unsigned char *)&IntegerValue ByteArray[Length-4] = CharArray[3] ByteArray[Length-3] = CharArray[2] ByteArray[Length-2] = CharArray[1] ByteArray[Length-1] = CharArray[0]
Have you considered using a
union
?"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
-
Have you considered using a
union
?"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
DavidCrow wrote:
using a union
I like your solution!
Maxwell Chen
-
ChemmieBro wrote:
No, that's not a typo
In that case you have a problem :) ... CharArray = new unsigned char [4]; CharArray = (unsigned char *)&IntegerValue //<--- overwrites the pointer allocated above!! The storage has already been allocated - it is the 4 bytes used by the IntegerValue variable. You only need the second line above... CharArray = (unsigned char *)&IntegerValue; Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
I see that, now. Thank you. I just needed a quick answer and got it. I'm just re-using some code and they had done this same thing using an integer and a two shorts. I figured if it worked that way, it would work using an integer and four unsigned chars. Now I'll have to change the old stuff, too. Thanks again.
-
Have you considered using a
union
?"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
No. This is existing code and I was just curious if I was allowed to do that or not. I thought I could but couldn't find anything out there to confirm that it would work correctly. I will look up Unions, though, for future reference. Thank you.
-
No. This is existing code and I was just curious if I was allowed to do that or not. I thought I could but couldn't find anything out there to confirm that it would work correctly. I will look up Unions, though, for future reference. Thank you.
ChemmieBro wrote:
No. This is existing code
You still can use union in the existing code! And you won't even need to cast.
ChemmieBro wrote:
I thought I could but couldn't find anything out there to confirm that it would work correctly.
You have the debugger of VC++ for you to watch the memory addresses and the values.
Maxwell Chen
-
ChemmieBro wrote:
No. This is existing code
You still can use union in the existing code! And you won't even need to cast.
ChemmieBro wrote:
I thought I could but couldn't find anything out there to confirm that it would work correctly.
You have the debugger of VC++ for you to watch the memory addresses and the values.
Maxwell Chen
Maxwell Chen wrote:
You still can use union in the existing code!
Except for the swapping of byte order (if I read the original code correctly). Mark
Mark Salsbery Microsoft MVP - Visual C++ :java:
-
Maxwell Chen wrote:
You still can use union in the existing code!
Except for the swapping of byte order (if I read the original code correctly). Mark
Mark Salsbery Microsoft MVP - Visual C++ :java: