开发者

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

开发者_C百科
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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜