std::string не распознает символ больше 127
Я сделал переход со стилем кода ASCII, и все было в порядке, пока я не сделал проверку CRC. В моем проекте crc - это один байт. В моем приемнике я положил все в std::string, и если crc меньше, чем 127, все в порядке. Но если мой crc терет значение 127, тогда к моей std::string добавляются дополнительные данные - пример ниже.
if crc = 80 -> in std:string "P"
if crc = 168 -> in std::string "�" (three diffrent signs)
Что я делаю неправильно? Я думал, что есть специальные символы выше 127, но теперь я потерялся...
РЕДАКТИРОВАТЬ: я пытался сделать это просто, но, конечно, я могу дать вам код:).
QSerialPort *serial = new QSerialPort;
std::string *buffer = new std::string;
//when 'readyRead' event comes from serial then:
QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();
Затем в потоке diffrent я работаю над буфером данных. Проблема в том, что когда я посылаю байт, который больше 127 - в этой ситуации к моему буферу добавляется дополнительный символ (как в первом примере).
2 ответа
Проблема здесь:
QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();
1) Вы полагаетесь на преобразование по умолчанию из QByteArray в QString, которое является utf-8, а не локальным латинским 1, если это то, что вы хотите.
QString:: QString (const QByteArray & ba)
Создает строку, инициализированную байтовым массивом ba. Данный байтовый массив преобразуется в Unicode с помощью fromUtf8(). Останавливает копирование с первого 0 символа, в противном случае копирует весь байтовый массив.
В этом случае вам нужно будет явно вызвать fromLatin1 для возвращаемого значения readAll, то есть:
QString tempBuffer = QString::fromLatin1(serial->readAll());
qDebug() << tempBuffer;
Ваше требование также может быть связано с локальным 8-битным интерфейсом, в этом случае вы будете делать что-то подобное, но с fromLocal8Bit.
2) Плохо выделять память для объекта std::string в куче. Он предназначен для стекового объекта.
3) В этом сценарии код будет намного проще, если вы вообще отбросите внутреннюю обработку данных std::string, потому что тогда вы также можете отбросить QString для общей операции и сохранить ее только для отображения данных. Таким образом, вы также можете получить "необработанные данные" с помощью метода data().
При работе с символьными данными более 127 следует помнить следующее:
4) Вам нужно установить 8 бит данных для свойства, которое является значением по умолчанию в наши дни, но вы должны убедиться, что оно не 7 бит.
5) Интерфейс QIODevice работает с типом char* для чтения и записи, и это зависит от компилятора, независимо от того, подписан он или нет. Пока вы обрабатываете их последовательно на стороне получателя и отправителя, это не будет проблемой.
Вы можете попробовать использовать wstring и, возможно, изменить свой набор символов.