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)吗?否则,请提供更多关于您想要做什么的上下文。 &amp;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*,引用 &amp;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"

【讨论】:

【参考方案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 ++将字符串转换为无符号字符并将其转换回以获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 C/C++ 无符号字符转换为 JAVA 时出现问题

将 4 个字节转换为无符号 32 位整数并将其存储在 long

将 VARIANT 转换为无符号字符数组

将特征矩阵转换为无符号字符 *

Perl - 将十六进制转换为二进制并将其用作字符串

C# |从 URL 抓取 JSON 无法将字符串转换为 int