C ++将字符串转换为无符号字符并将其转换回以获取字符串
Posted
技术标签:
【中文标题】C ++将字符串转换为无符号字符并将其转换回以获取字符串【英文标题】:C++ Converting a String to unsigned char and convert it back to get the string 【发布时间】:2016-02-03 08:53:10 【问题描述】:我希望我已经清楚地说明了我在主题中的目标,以下是我正在使用的代码。
#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
我应该怎么做才能将“测试”作为字符串。
【问题讨论】:
不确定您要在这里实现什么。你基本上只是在四处投射指针。你试过std::string(some-of-your-pointer)
吗?否则,请提供更多关于您想要做什么的上下文。
&data_ptr
不是指向字符的指针,而是指向指向某些字符的指针的指针。
^joachim 说了什么.. 还想知道const char *data_ptr =(char*)"test";
符号是从哪里得到的,难道我以前从未见过(char*)
演员吗?
@stijn 对演员阵容的看法是正确的。根据定义,"test"
无论如何都是常量,因此不需要强制转换。约阿希姆对指针的看法是正确的;这就是为什么第二个字符串 (s
) 输出垃圾的原因。
是的,我关于指针的错误。但我真正想知道的是将 uint8_t 数组转换为字符串。我知道有一个数组。我不知道它是否为空终止。所以我试图将字符串转换为 uint8_t 并从我创建的 uint8_t 中取回字符串。
【参考方案1】:
正如上面的 cmets 所指出的,你的 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);
s
和 s1
都包含您的源字符串 "test"
。
【讨论】:
【参考方案2】:"test" 不适合无符号字符。您应该使用标准 c 函数 atoi 和 itoa 进行转换。如果您想逐个字符地执行此操作,也可以使用这些函数。
【讨论】:
他将它分配给const char*
,这是一个指向序列的指针,是字符(即数组)。他的输入不适合 unsigned char 没有问题。【参考方案3】:
我不完全确定您要在这里做什么。然而,改变
const uint8_t* p = reinterpret_cast<const uint8_t*>(&data_ptr);
到
const uint8_t* p = reinterpret_cast<const uint8_t*>(data_ptr);
会为您完成这项工作。
【讨论】:
【参考方案4】: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";
编辑:正如您在 cmets 中所说,您需要一个 uint8_t
,为此只需按原样使用原始 char*
:
const uint8_t* intptr = reinterpret_cast<const uint8_t*>(charptr);
在线试用:http://ideone.com/drJYuR
【讨论】:
以上是关于C ++将字符串转换为无符号字符并将其转换回以获取字符串的主要内容,如果未能解决你的问题,请参考以下文章