使用std :: string来保存二进制数据是否有效,以避免手动动态内存管理

Che*_*eng 31 c++

注意base64_decodehttp://www.adp-gmbh.ch/cpp/common/base64.html

std::string base64_decode(std::string const& encoded_string)
Run Code Online (Sandbox Code Playgroud)

该函数假设返回byte array以指示二进制数据.但是,该功能正在返回std::string.我的猜测是,作者试图避免执行显式动态内存分配.

我尝试验证输出是否正确.

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();
}
Run Code Online (Sandbox Code Playgroud)

解码输出是正确的.只是想确认一下std::string,保存二进制数据是否有效,避免手动动态内存管理.

std::string s;
s += (char)0;
// s.length() will return 1.
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 46

是的,你可以存储任何序列charstd::string.这包括任何二进制数据.

  • 更具体地说,包括'\ 0'字符. (13认同)
  • 当然,在这种情况下不要使用`c_str()`(好吧,不要指望`\ 0`终止符无论如何都是字符串结尾的准确指示) (8认同)
  • @bdonlan:如果你愿意,你可以使用`c_str()`,但你可能也需要参考`size()`.在这种情况下,我更喜欢`data()`,它感觉更加惯用.(`c_str()`和`data()`将在C++ 0x中执行_exactly_相同的操作.) (3认同)
  • @programmer:你应该问这个问题.(基本上你选择的构造函数只读取你的字符串的第一个NUL.) (3认同)

650*_*502 18

是.std :: string可以保存任何char值('\0'没有特殊含义).但是,我不会惊讶地发现一些C++函数(例如来自外部库)与嵌入NUL的字符串有问题.

无论如何,我不明白你会得到什么,std::string而不是std::vector<unsigned char>那会使你的意图更清晰,并提供更多的保证(例如,所有字节都在连续的非共享内存中,以便你可以传递&x[0]给期待的人用于直接访问的普通缓冲区).

  • 在C++ 0X中,`std :: string`保证是连续的,并且所有已知的C++ 03实现都是连续的.见http://herbsutter.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/ (7认同)