2016-02-03 10 views
-2

Надеюсь, что я четко изложил свою цель в теме, а следующий - код, который я использую.C++ Преобразование строки в unsigned char и преобразование ее обратно, чтобы получить строку

#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 [email protected] 
p1 [email protected] 
p2 [email protected] 
final is [email protected] 
final1 is 4<-->4 

Что мне делать, чтобы получить «тест» в виде строки.

+0

Не знаете, чего вы пытаетесь достичь здесь. Вы в основном просто бросаете указатели. Вы пробовали 'std :: string (some-of-your-pointer)'? В противном случае давайте немного больше контекста о том, что вы хотите сделать точно. –

+2

'& data_ptr' не является указателем на символы, это указатель * на указатель * на некоторые символы. –

+0

^what joachim said .. также интересно, где вы получили 'const char * data_ptr = (char *)" test ";' notation, не думаю, что я когда-либо видел это '(char *)' cast before? – stijn

ответ

2

Как было отмечено в комментариях выше, ваш 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".

0

std :: string имеет конструктор, принимающий char* или const char* в качестве параметра. Она также имеет функцию c_str(), чтобы сделать преобразование обратно в char* так что все Thats, необходимого это:

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"; 

Edit: Как указано в комментариях вам нужно uint8_t, для этого просто взять сырую char* как это является:

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

Попробуйте онлайн: http://ideone.com/drJYuR

0

"тест" не будет вписываться в беззнаковом символе. Вы должны использовать стандартные функции c atoi и itoa для преобразования. Вы также можете использовать эти функции, если хотите сделать это символом по символу.

+0

Он назначает его 'const char *', который является указателем на последовательность символов (т. Е. Массив). Нет никаких сомнений в том, что его вход не вписывается в символ без знака. –

0

Я не совсем уверен, что вы здесь делаете.Однако изменение

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

в

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

будет делать работу за вас.