У меня здесь очень простой вопрос. Некоторое время я пробовал поискать в Google, потому что есть много похожих вопросов, но ни одно из решений у меня не помогло.

Вот фрагмент кода, который показывает проблему:

QString test = "hello";
unsigned char* test1 = (unsigned char*) test.data();
unsigned char test2[10];
memcpy(test2,test1,test.size());
std::cout<<test2;

Я пытаюсь поместить QString в массив беззнаковых символов, но на выходе всегда получается просто «h».

Может ли кто-нибудь сказать мне, что здесь не так?

4
samoncode 18 Фев 2014 в 18:58

2 ответа

Лучший ответ

Проблема в том, что QString.data() возвращает QChar*, но вы хотите const char*

QString test = "hello";
unsigned char test2[10];
memcpy( test2, test.toStdString().c_str() ,test.size());
test2[5] = 0;
qDebug() << (char*)test2;
             ^^^
            this is necessary becuase otherwise
            just address is printed, i.e. @0x7fff8d2d0b20

Назначение

unsigned char* test1 = (unsigned char*) test.data();

И пытаюсь скопировать

unsigned char test2[10];
memcpy(test2,test1,test.size());

Неверно, потому что QChar - это 16-битная сущность и поэтому попытка копирования будет прекращена из-за 0 байта сразу после 'h'.

6
4pie0 18 Фев 2014 в 16:00

Во второй строке вы пытаетесь преобразовать QChar* в (unsigned char*), что совершенно неверно.

Попробуй это:

QString test = "hello";
QByteArray ba = test.toLocal8Bit();
unsigned char *res = (unsigned char *)strdup(ba.constData());
std::cout << res << std::endl;
3
hank 18 Фев 2014 в 15:25