漫长学期的预告

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

 

 

 

 

 

 


 
posted on 2023-08-06 11:54  漫长学期的预告  阅读(36)  评论(0编辑  收藏  举报