-
Copying from unsigned char * to the CString
Hi All,
I have unsigned char * buffer in which some data are stored , now I want to move these all data to my CString variable for some operations.
I tried to copy but problem is that in my unsigned char * some data are padded as zero, So I hope that in CString it gets the null value so it can not copy whole data.
I tried to copy from unsigned char * to the CString using...
CString tmpMsg = CString(msg); // Here msg is the unsigned char *
Ashish
-
Re: Copying from unsigned char * to the CString
Don't try to use CString for containing binary data - it won't work. Tell us more about what you are doing and we can suggest alternatives.
-
Re: Copying from unsigned char * to the CString
So you want to copy a buffer to a CString variable and want to keep the characters that are set to 0. So that the string was something like this 'ABC\0\0DEF'. Is that correct?
-
Re: Copying from unsigned char * to the CString
In my unsigned char * buffer I have all char data, so I want all these data into my CString variable.
I tried to use memcpy() ,but it gives me the runtime error like....
TestRTMP.exe: 0xC0000005: Access violation reading location 0x49468964.
so plz help me.
Thanks.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by cilu
So you want to copy a buffer to a CString variable and want to keep the characters that are set to 0. So that the string was something like this 'ABC\0\0DEF'. Is that correct?
when 0 value comes in CString it shows nothig(Just like blank space)...
I m not getting that to much,but the problem is of zero value.
-
Re: Copying from unsigned char * to the CString
While it is technically possible to store a binary 0 in a CString you should not do it. There are too many problems that will be encountered. The bottom line is that most of the CString member functions (including the constructor you are trying to use) assume binary 0 is the end-of-string terminator and will fail for whatever purpose you intend. Once again, you need to re-think your application and use a container other than CString.
-
Re: Copying from unsigned char * to the CString
0xC0000005 is right, my suggestion is to use std::string for that purpose.
Regards,
Usman.
-
Re: Copying from unsigned char * to the CString
Although it's not a very brilliant idea, you can store any character including '\0' in a CString object as follows
Code:
void CFoo::FillString(CString& str, unsigned char* msg, int length)
{
char* buffer = str.GetBufferSetLength(length);
memcpy(buffer, msg, length);
str.ReleaseBuffer(length);
}
With one condition: use that object only for storing; another subsequent call of one of CString methods may truncate it to the first '\0' value.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by usman999_1
0xC0000005 is right, my suggestion is to use std::string for that purpose.
UUUghhh!
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by ovidiucucu
UUUghhh!
:rolleyes:
-
Re: Copying from unsigned char * to the CString
I wouldn't use any kind of string, std, CString or anything else you find to store data that contains a NULL.
-
Re: Copying from unsigned char * to the CString
Right.
A possible better approach is to write your own "buffer" class like for example:
Code:
class CBuffer
{
unsigned char* buffer;
unsigned int length;
public:
CBuffer() : buffer(NULL), length(0) {};
SetBuffer(unsigned char* src, unsigned int length);
unsigned int GetLength() const {return length;}
// and so on, and so on... all you need
};
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by GCDEF
I wouldn't use any kind of string, std, CString or anything else you find to store data that contains a NULL.
What's wrong with std::string???
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by usman999_1
What's wrong with std::string???
Why do you think it's better than CString?
-
Re: Copying from unsigned char * to the CString
What is the advantage of writing your own buffer class instead
of using std::string ???????????????????????
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by ovidiucucu
Right.
A possible better approach is to write your own "buffer" class like for example:
Code:
class CBuffer
{
unsigned char* buffer;
unsigned int length;
public:
CBuffer() : buffer(NULL), length(0) {};
SetBuffer(unsigned char* src, unsigned int length);
unsigned int GetLength() {return length;}
// and so on, and so on... all you need
};
What is wrong with std::string???
Try this
Code:
void DoSomethingWithBinaryData(char* szData, unsigned int nLen)
{
std::string BinaryData;
BinaryData.assign(szData, nLen);
// Now you have access to all those handy functions of std::string and what not
// And to get the data back
DoSomethingElseWithThisBinaryData(BinaryData.data(), BinaryData.size());
}
Now why would you need a buffer class with managing memory yourself???
Regards,
Usman.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by usman999_1
What's wrong with std::string???
Depends how you're trying to use it. The data it contains wouldn't work with a lot of C style string functions. As long as you remember what you're doing with it I suppose you could avoid trouble, but a year from now when he forgets it's not compatible with regular const char* functions or future programmer don't know what he's up to, things will work as anticipated.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by GCDEF
Depends how you're trying to use it. The data it contains wouldn't work with a lot of C style string functions. As long as you remember what you're doing with it I suppose you could avoid trouble, but a year from now when he forgets it's not compatible with regular const char* functions or future programmer don't know what he's up to, things will work as anticipated.
But if the data contains embedded NULLS, it will not be compatible
with C stsyle string functions to start with. So how does using
std::string make it worse ? Plus you can use the string member
functions and algorithms to search/replace etc.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by ovidiucucu
Why do you think it's better than CString?
Well, I dont want to start this CString vs std::string debate all over again. CString is better for MFC functions requiring CString. But CString is designed and should be used as C++ version of c-string (null terminated string), while std::string is more versatile & can act a buffer (for binary or null-terminated data) and provides you will a good api to access and manipulate it.
My 2 cents....
Regards,
Usman.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by usman999_1
What is wrong with std::string???
Nothing. It can store binary data using the proper member functions, as you've demonstrated.
I think it's just the name "std::string" that gives the impression "it stores only null-terminated strings".
Code:
typedef std::string BufferHandler;
//...
BufferHandler buf;
Now it looks "nicer" to say "BufferHandler x" instead of "std::string x".
Regards,
Paul McKenzie
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by Philip Nicoletti
But if the data contains embedded NULLS, it will not be compatible
with C stsyle string functions to start with. So how does using
std::string make it worse ? Plus you can use the string member
functions and algorithms to search/replace etc.
Because it's not intuitively obvious to a programmer that sting data will contain embedded nulls. Another programmer may come along and use c_str() method to pass the contents to another function for example. Very few programmers are going to look at any kind of string object and expect its data to contain embedded nulls.
-
Re: Copying from unsigned char * to the CString
But it is not "intuitively obvious" that an char array will contain
embedded nulls either. If the function that you send the data to
works with NULL terminated strings, it will not work "properly" ...
regardless of whether it is a std::string , CString, custom buffer,
or raw character array.
-
Re: Copying from unsigned char * to the CString
Quote:
Originally Posted by Paul McKenzie
Nothing. It can store binary data using the proper member functions, as you've demonstrated.
I think it's just the name "std::string" that gives the impression "it stores only null-terminated strings".
As I have demonstated in my first post, CString isn't obviously containing "only null-terminated strings". Can be also just an impression of outside-MFC visitors. ;)