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);
"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);
并且 s
和 s1
都包含您的源字符串 "test"
.
我不完全确定你想在这里做什么。但是,改变
const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);
到
const uint8_t* p = reinterpret_cast<const uint8_t*>(data_ptr);
会为您完成这项工作。
我希望我已经在主题中清楚地说明了我的目标,下面是我正在使用的代码。
#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);
"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);
并且 s
和 s1
都包含您的源字符串 "test"
.
我不完全确定你想在这里做什么。但是,改变
const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);
到
const uint8_t* p = reinterpret_cast<const uint8_t*>(data_ptr);
会为您完成这项工作。