Необходимо преобразовать char * (указатель) в wchar_t * (указатель) - PullRequest
1 голос
/ 15 сентября 2010

Я выполняю связь через последовательный порт с насосом, управляемым компьютером, и функция createfile, которую я использовал для связи, требует, чтобы имя com-порта было проанализировано как указатель wchar_t.

Я также использую QT для создания формы и получения имени com-порта в виде QString.

Эта строка QString преобразуется в массив символов и указывает на следующее:

   char* Dialog::GetPumpSerialPortNumber(){
   QString mystring;
   mystring = ui->comboBox_2->currentText();
   char * mychar;
   mychar = mystring.toLatin1().data();
   return mychar;

Теперь мне нужно установить номер моего порта, который хранится как wchar_t * в моем объекте насоса. Я делаю это, вызывая следующую функцию:

   void pump::setPortNumber(wchar_t* portNumber){
       this->portNumber = portNumber;
   }

Таким образом, как я могу изменить свой char * (mychar) на wchar_t * (portNumber)?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 31 марта 2011

Если вы говорите только о необходимости массива char для массива wchar_t, вот решение для вас:

static wchar_t* charToWChar(const char* text)
{
    size_t size = strlen(text) + 1;
    wchar_t* wa = new wchar_t[size];
    mbstowcs(wa,text,size);
    return wa;
}
1 голос
/ 03 января 2017

Улучшение ответа leetNightshade может быть

size_t unistrlen(const char *s) {
    size_t sz = 0;
    const char *sc;
    for (sc = s; *sc != '\0'; sc+=(
        ((*sc&0x80)==0x80) ? 2 :/*1st byte of 2-byte character*/
        ((*sc&0xc0)==0xc0) ? 3 :/*1st byte of 3-byte character*/
        ((*sc&0xe0)==0xe0) ? 4 :/*1st byte of 4-byte character*/
        ((*sc&0xf0)==0xf0) ? 1 :/*2nd, 3rd, or 4th byte of multi-byte character*/
                             1) /*single byte character*/)
        if ((*sc&0xf0)!=0xf0) sz++;
    return sz;
} 

wchar_t* charToWChar(const char* text) {
    size_t size = unistrlen(text) + 1;
    wchar_t* wa = new wchar_t[size];
    mbstowcs(wa,text,size);
    return wa;
}

Где unistrlen будет возвращать количество символов (одиночных или многобайтовых символов) в вашей строке в отличие от strlen, который возвращает длину в байтах и ​​может потратить некоторую память, если ваша строка содержит несколько многобайтовых символов.

0 голосов
/ 31 августа 2011

Я нашел полезную статью в MSDN - Как: конвертировать между различными типами строк . Я думаю, это должно быть полезно.

0 голосов
/ 15 сентября 2010

Вы можете использовать функцию toWCharArray, равную QString, чтобы получить значение wchar_t * и вернуть wchar_t * из функции GetPumpSerialPortNumber.

0 голосов
/ 15 сентября 2010
...