C++ 将字符串转换为无符号字符并将其转换回以获取字符串

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

本文关键字:字符串 转换 获取 无符号 C++ 字符      更新时间:2023-10-16

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

#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

我应该怎么做才能将"测试"作为字符串。

正如上面的评论所指出的,你的data_ptr排队

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

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

string s1( data_ptr);

包含正确的test字符串,而 s ,如初始化

string s( reinterpret_cast<char const*>(p1),4) ;

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"

"test" 不适合无符号字符。 您应该使用标准的 c 函数 atoi 和 itoa 进行转换。 如果您想逐个字符地执行此操作,也可以使用这些函数。

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

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

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

会为你做这项工作。

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