Доброго времени суток!
Имеется функция, служащая для перевода массива bit'ов в строки (один элемент QVector'а соответствует одному символу).
QVector<QString> SignalHandler::BitToStr(QVector<QByteArray> message)
{
QVector<QString> reconstructedMessage;
QVector<QByteArray> hexByteArray;
for (int i = 0; i < message.size(); ++i){
hexByteArray.append(QByteArray::number(message[i].toInt(), 16));
}
return reconstructedMessage;
}
Для начала хочу перевести это счастье в hex, однако кириллические символы в упор не переводятся.
Вот что получается. Символы после [3] кириллические.
Буду благодарен за любую помощь, заранее спасибо!
Как конвертировать QByteArray, содержащий кириллицу или другой текст в QString зависит от используемой кодировки (как текст в виде байт закодирован). К примеру, если QByteArray содержит текст в utf-8 кодировке, то можно его напрямую в QString() конструктор передать:
QString u{utf8bytes}; // implicit QString::fromUtf8()
Если используется кодировка из текущей локали: QString::fromLocal8Bit(locale_bytes).
Если кодировка задана по имени, можно QTextCodec использовать:
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
u = codec->toUnicode(cp1251_bytes);
Вот полный пример кода, который показывает как Unicode текст можно в байты превратить, используя различные кодировки. И как эти байты назад в текст преобразовать:
#include <QDebug>
#include <QString>
#include <QTextCodec>
int main()
{
// unicode to bytes
QString s{QStringLiteral(u"мир")};
QByteArray utf8bytes = s.toUtf8();
qDebug() << utf8bytes;
QByteArray locale_bytes = s.toLocal8Bit(); // result may be undefined
qDebug() << locale_bytes; // same as utf8bytes in my case (C.UTF-8 locale)
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
QByteArray cp1251_bytes = codec->fromUnicode(s);
qDebug() << cp1251_bytes;
// bytes to unicode
QString u{utf8bytes}; // implicit QString::fromUtf8()
qDebug() << u;
qDebug() << QString::fromLocal8Bit(locale_bytes);
qDebug() << codec->toUnicode(cp1251_bytes);
}
Чтобы собрать, добавьте в <name>.pro, сгенерированный по умолчанию с помощью qmake -project команды:
CONFIG += c++11
В коде в вопросе какая-то странная схема кодирования текста используется. Судя по имени, каждый QByteArray содержит байты, соответствующие "0", "1" символам в ASCII кодировке, то есть крайне неэффективное представление последовательности бит. Каждая последовательность бит, судя по значению кодирует номер символа (unicode code point или utf-16 code unit -- по данным не ясно). К примеру, первые 6 элементов в QVector<QByteArray> кодируют текст: 12GЖйц:
>>> codepoints = ["110001", "110010", "1000111", "10000010110", "10000111001", "10001000110"]
>>> [chr(int(bits, 2)) for bits in codepoints]
['1', '2', 'G', 'Ж', 'й', 'ц']
Если биты у вас кодируют utf-16 code unit, то можно использовать bits.toInt(nullptr, 2) (или если code point, то QByteArray::toLong()). Чтобы последовательность utf-16 code units превратить в текст, можно использовать QString::fromUtf16():
QByteArray bits{"10000010110"};
char16_t utf16codeunit = bits.toInt(nullptr, 2);
char16_t str[] = {utf16codeunit, 0};
u = QString::fromUtf16(str);
qDebug() << u; // -> "Ж"
Если не касаться общей эффективности приведенного фрагмента кода (почему символы передаются в виде массива символов с бинарным их представлением - не понятно), то проблема кроется в вызове
message[i].toInt()
который преобразует строку с текстовым представлением числа в само это число. Основание системы счисления по умолчанию - 10 (что уже не правильно - вам нужно 2). Почему длинные последовательности не преобразовываются - потому что их бинарное представление (с учетом того, что строки интерпретируются как десятичные) не влезает в int. Для получения требуемого эффекта нужно заменить указанный вызова на
message[i].toInt(nullptr, 2)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей