Is it valid, to use std::string to hold binary data, to avoid manual dynamic memory management
Pay attention to base64_decode
in http://www.adp-gmbh.ch/cpp/common/base64.html
std::string base64_decode(std::string const& encoded_string)
The function is suppose to return byte array
to indicate binary data. However, the function is returning std::string
. My guess is that, the author is trying to avoid from perform explicit dynamic memory allocation.
I try to verify the output is correct.
int main()
{
unsigned char data[3];
data[0] = 0; data[1] = 1; data[2] = 2;
std::string encoded_string = base64_encode(data, 3);
// AAEC
std::cout << encoded_string << std::endl;
std::string decoded_string = base64_decode(encoded_string);
for (int i = 0; i < decoded_string.length(); i++) {
// 0, 1, 2
std::cout << (int)decoded_string.data()[i] << ", ";
}
std::cout << std::endl;
getchar();
}
The decoded output is correct. Just want to confirm, is it valid to std::string
to hold binary data, to avoid manual dynamic memory management.
std::string s;
s += (char)0;
// s.length() will return 1.
Yes, you can store any sequence of char
in a std::string
. That includes any binary data.
Yes. std::string can hold any char value ('\0'
has no special meaning). However I wouldn't be surprised finding some C++ functions (e.g. from external libraries) having problems with strings with embedded NULs.
Anyway I don't understand what you are going to gain with an std::string
instead of std::vector<unsigned char>
that would make your intentions more clear and that offers more guarantees (e.g. that all the bytes are in contiguous not-shared memory so that you can pass &x[0]
to someone expecting a plain buffer for direct access).
I don't think it's completely valid.
Care must be taken with string and binary data because it uses internally char type and char depends in the implementation if it is defined as unsigned or signed type. I prefer to use basic_string<unsigned char>
and be sure of what i'm reading.
I dont think one should use std::string for byte-data-storage. The method provide aren't design to deal with byte-data and you will risk yourself since any changes (or "optimization") on std::string will break your code.
it is better to use std::vector or std::vector (where byte is typedef to uint8 ) to express nature of data. You will no longer have string specific functions available , which is what you want for binary data
You need an array of character( not string) to store the binary data. Best is use vector.
精彩评论