繁体   English   中英

将 const unsigned char[] 转换为 std::string 后的字符串大小

[英]string size after converting const unsigned char[] to std::string

我试图将 unsigned char 数组转换为大小为 16 的 std::string。但我不知道为什么结果字符串大小不同。 我想知道原因。

#include <iostream>

using namespace std;

const unsigned char t[16] = { 0x1E, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 ,0x08 ,0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
const unsigned char t2[16] = { 0x1E, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 ,0x08 ,0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
const unsigned char t3[16] = { 0x44, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 ,0x68 ,0x69, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65 };

int main() {
    string a, a2, a3;
    a = static_cast<std::string>(reinterpret_cast<const char*>(t));

    a2.assign(reinterpret_cast<const char*>(t2), 16);

    a3.assign(reinterpret_cast<const char*>(t3));   

    cout << "size : " << a.size() << endl;
    for (int i = 0; i < a.size(); i++)
        printf("0x%02X ", a.c_str()[i]);
    cout << endl << endl;

    cout << "size2 : " << a2.size() << endl;
    for (int i = 0; i < a2.size(); i++)
        printf("0x%02X ", a2.c_str()[i]);
    cout << endl << endl;

    cout << "size3 : " << a3.size() << endl;
    for (int i = 0; i < a3.size(); i++)
        printf("0x%02X ", a3.c_str()[i]);
    cout << endl << endl;

    return 0;
}

结果

尺寸:56

0x1E 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x10 0x11 0x12 0x13 0x14 0x15 0x1E 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x10 0x11 0x12 0x13 0x14 0x15 0x44 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x68 0x69 0x60 0x61 0x62 0x63 0x64 0x65 0x5F 0x41 0x72 0x67 0x4C 0x69 0x73 0x74

尺寸2:16

0x1E 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x10 0x11 0x12 0x13 0x14 0x15

尺寸3:24

0x44 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x68 0x69 0x60 0x61 0x62 0x63 0x64 0x65 0x5F 0x41 0x72 0x67 0x4C 0x69 0x73 0x74

情况1:输入没有明确地以空值结尾,并且可能那些全局 arrays 顺序放置在 memory 中,因此您至少得到 48 个不带零的字节,最后它在前面找到一些零 8 个字节,因此总数为 56。

案例 2:在这里你给它明确的长度,这是在 null 终止符不存在的情况下做事的正确方法。

案例 3:类似于案例 1,但只是从数组 3 开始,并且需要相同的额外 8 个字节,直到在某处找到 null 终止符。

解决方案:添加 null 终止符(零字节)或使用具有明确长度规范的变体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM