C++ 中Array和Vector内存地址都是连续的,那么也可以把一块连续的字符串或二进制数据char*、char[],转成int[]、double[]数据吧。
void test5(){ // 假设有一个 char* 指向字符串的内存数据 char* data = "hello"; size_t dataSize = strlen(data) * 4; size_t intArraySize = dataSize / sizeof(int); int* intPtr = reinterpret_cast<int*>(data); int intArray[intArraySize]; memcpy(intArray, intPtr, dataSize); for (size_t i = 0; i < intArraySize; ++i) { std::cout << "test5 intArray[" << i << "] = " << intArray[i] << std::endl; } }
上方定义了 char* data = "1" 想将,其数据拷贝到 intArray 中。尝试用std::string,但结果是不稳定的!只有char*稳定。
PS:
1.strlen()无法读取char*字符的情况。
char* data0 = "\x01\x00\x00\x00\x02\x00\x00\x00";
无法用strlen(data0)读取取其长度,这里本应该为8字节,但是x00 就是 '\0'的16进制编码,这里相当于第一个字节'x01后就结束了',读取长度为1.
2.字符串std::string的内存对象数据往int[]中拷贝有很多未知因素,导致拷贝随机化。原因暂未知。
test5_0()和test5_1()完全一致的转换但打印结果不同。甚至去掉下面注释行下面的打印,都会导致结果更不稳定。目前使用char*拷贝是稳定的。
void test5_0(){ string data = "hello"; size_t dataSize = data.size() * 4; size_t intSize = dataSize / 4; int intArr[intSize]; memcpy(intArr, data.c_str(), dataSize); for (int xx : intArr ){ std::cout << "test5_0[i] = " << xx <<std::endl; } } void test5_1(){ string data = "hello"; size_t dataSize = data.size() * 4; size_t intArraySize = dataSize / 4; int intArray[intArraySize]; memcpy(intArray, data.c_str(), dataSize); for (size_t i = 0; i < intArraySize; ++i) { std::cout << "test5_1 intArray[" << i << "] = " << intArray[i] << std::endl; } // 若注释掉此打印行,则上面 test5_1 intArray 行的打印会出现问题 for (int xx : intArray ){ std::cout << "test5_1[i] = " << xx <<std::endl; } }
打印结果:
test5_0[i] = 1819043176 test5_0[i] = 111 test5_0[i] = 0 test5_0[i] = 0 test5_0[i] = 0 test5_1 intArray[0] = 1819043176 test5_1 intArray[1] = 111 test5_1 intArray[2] = 5 test5_1 intArray[3] = 0 test5_1 intArray[4] = 1819043176 test5_1[i] = 1819043176 test5_1[i] = 111 test5_1[i] = 5 test5_1[i] = 0 test5_1[i] = 1819043176
标签:x00,test5,int,char,intArray,存疑,data From: https://www.cnblogs.com/scarlet/p/17609258.html