C ++将字符串转换为unsigned char并将其转换回以获取字符串

C++ Converting a String to unsigned char and convert it back to get the string

我希望我已经在主题中清楚地说明了我的目标,下面是我正在使用的代码。

#include <stdio.h>
#include <inttypes.h>
#include <iostream>
using namespace std;

int main() {
    const char *data_ptr =(char*)"test";
    const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);
    uint8_t* p1= const_cast<uint8_t*>(p);
    char* p2 = reinterpret_cast<char*>(p1);
    const char *final= const_cast<const char*>(p2);
    string s1( data_ptr);
    string s( reinterpret_cast<char const*>(p1),4) ;
    cout<<"data_ptr is "<<data_ptr<<endl;
    cout<<"p "<<p<<endl;
    cout<<"p1 "<<p1<<endl;
    cout<<"p2 "<<p2<<endl;
    cout<<"final is "<<final<<endl;
    cout<<"final1 is "<<s1.size() << "<-->"<<s.size()<<endl;
    return 0;
}

打印出来的内容如下

data_ptr is test
p X@
p1 X@
p2 X@
final is X@
final1 is 4<-->4

我应该怎么做才能将 "test" 作为字符串获取。

std::string 有一个以 char*const char* 作为参数的构造函数。它还有一个函数 c_str() 可以将转换回 char* 所以所需要的就是这个:

const char* charptr = "Test";
string str(charptr);
const char* charptr2 = str.c_str();

//just to verify:
cout << charptr << "\n";
cout << str << "\n";
cout << charptr2 << "\n";

编辑:正如您在评论中所述,您需要一个 uint8_t,为此只需使用原始的 char*

const uint8_t* intptr = reinterpret_cast<const uint8_t*>(charptr);

在线试用:http://ideone.com/drJYuR

"test" 不适合 unsigned char。您应该使用标准的 c 函数 atoi 和 itoa 进行转换。如果你想一个字一个字地做,你也可以使用这些函数。

正如上面的评论所指出的,您的 data_ptr 在线

const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);

从指向字符的指针 (char*) 转换为字符指针的指针(在您的例子中 uint8_t*,引用 &data_ptr,这又是 char*).这也是为什么你的字符串 s1 in

string s1( data_ptr);

包含正确的 test 字符串,而 s

中初始化
string s( reinterpret_cast<char const*>(p1),4) ;

with p1

引用错误的指向字符的指针
const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);
uint8_t* p1= const_cast<uint8_t*>(p);

刚刚用垃圾数据初始化。

所以只需更改您的线路

const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);

const uint8_t* p = reinterpret_cast<const uint8_t*>(data_ptr);

并且 ss1 都包含您的源字符串 "test".

我不完全确定你想在这里做什么。但是,改变

const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);

const uint8_t* p = reinterpret_cast<const uint8_t*>(data_ptr);

会为您完成这项工作。