0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
1

Произвольная кодировка текста

10.11.2015, 11:09. Показов 1708. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть вот такой вот массив: bool a2[10];
Имеется textEdit, в котором представлена произвольная информация, символы - буквы, цифры...
Мне нужно получить бинарный код, который я запишу в bool a2[10].

Я смотрел примеры, как это вообще делается:
Код
QTextCodec *koiCodec = codecForName("KOI8-R");
    QByteArray data = koiCodec->fromUnicode(ui->textEdit->toPlainText());
Но ошибка:
C:\Users\engineer\Documents\Qt\sig_gen\mainwindow.cpp:11: ошибка: 'codecForName' was not declared in this scope
QTextCodec *koiCodec = codecForName("KOI8-R");
Я не нашел ответа, но понял, что мне нужно не совсем так. Есть МКТ-2:
https://ru.wikipedia.org/wiki/%D0%9C%D0%A2%D0%9A-2 Мне нужно кодировать и декодировать символы этим кодом. То есть получить биты в bool и наоборот. Хотя бы получить байты и вернуть строку обратно. Как это проще написать на QT?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2015, 11:09
Ответы с готовыми решениями:

Кодировка текста перестановкой столбцов в массиве, составленном из слов текста
Нужно заполнить двумерный массив с поля (Edit) после некоторых операций вывести массив в поле....

Кодировка текста
Доброго времени суток всем! Нужна было програма для перекодирование текста в Word-е... В...

Кодировка текста
Доброго времени суток! У меня следующая ситуация: создал папку в убунте, разшарил. Захожу на нее с...

кодировка текста
доброго времени суток, подскажите пожалуйста как решить такую задачку на delphi: "Закодировать и...

22
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
10.11.2015, 14:50 2
C++ (Qt)
1
2
Qchar ch = str.at(i);
quint8 xx = (quint8)xx.toAscii();
Возвращает байт с кодом символа. Не?
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
10.11.2015, 14:59 3
QTextEdit::document()?

Он вернет текст из QTextEdit, который можно записать в QString и с ним работать.
0
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
10.11.2015, 16:27 4
Цитата Сообщение от Amok Посмотреть сообщение
QTextEdit::document()
QString toPlainText() const
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
10.11.2015, 17:07  [ТС] 5
Возвращает байт с кодом символа. Не?
Почти, но это ASCII, и она же 16-разрядная, или я заблуждаюсь? Вот koi8-r - восьмиразрядная. А мне в итоге нужно вообще следующее. Сделать таблицу МКТ-2, если ее не существует. То есть char A = byte 0x03, char Б = byte 0x19 и тп. Это всего 5 бит на символ. И, затем, нужно сделать декодирование и кодирование, то есть представить "А" сначала в виде 0x03, а желательно прямо в виде бит 11000, а затем из этой последовательности бит снова получить "A". Как проще сделать?
Дело еще в том, что мне нужно работать именно с отдельными битами, с последовательностью бит.
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
10.11.2015, 21:03 6
Я бы сделал сделал вручную. Т.к. никакой логики в кодировке нет, нужно использовать таблицу. Ищешь в таблице символ и добавляешь биты. Работы на пару часов.

C++ (Qt)
1
2
3
4
bitset bts;
Qchar ch;
 
if (ch == "A") bts << 1 << 1 << 0 << 0 << 0;
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
11.11.2015, 09:42  [ТС] 7
А почему так не работает? Я просто программировал на Visual, сейчас вспоминаю QT, уже не помню. Вроде это что-то банальное, но не могу исправить:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString str = ui->textEdit->toPlainText();
    //QTextCodec *koiCodec = QTextCodec::codecForName("KOI8-R");
    //QByteArray data = koiCodec->fromUnicode(ui->textEdit->toPlainText());
    int a1[10];
 
    a1[0] = ui->lineEdit->text().toInt();
    a1[1] = 0;
    bool a2[10];
    a2[0] = 1;
}
 
void ToBin()
{bitset bts;
    Qchar ch;
     
    if (ch == "A") bts << 1 << 1 << 0 << 0 << 0;
}
 
MainWindow::~MainWindow()
{
 
    delete ui;
}
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.11.2015, 10:38 8
Цитата Сообщение от lennen Посмотреть сообщение
C:\Users\engineer\Documents\Qt\sig_gen\mainwindow.cpp:11: ошибка: 'codecForName' was not declared in this scope
QTextCodec *koiCodec = codecForName("KOI8-R");
C++ (Qt)
1
2
#include <QTextCodec>
QTextCodec *koiCodec = QTextCodec::codecForName("KOI8-R");
Если кодека нет, сообщат в консоли.
Цитата Сообщение от lennen Посмотреть сообщение
if (ch == "A") bts << 1 << 1 << 0 << 0 << 0;
Видимо, предполагается:
C++ (Qt)
1
2
3
4
5
6
quint32 toBin(QChar c){
switch (c) {
case 'a': return 0x00001001U;
//...
return -1;
}
Что не сильно отличается от написания своего кодека.
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
11.11.2015, 12:09  [ТС] 9
C KOI8-R разобрался, а вот
C++
1
2
3
4
5
6
quint32 toBin(QChar c){
switch (c) {
case 'a': return 0x00001001U;
//...
return -1;
}
приводит к ошибке
C:\Users\engineer\Documents\Qt\sig_gen\mainwindow.cpp:25: ошибка: switch quantity not an integer
switch (c) {
^
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.11.2015, 14:22 10
Попробуйте c.unicode ()

Добавлено через 41 секунду
Или c.toAscii()
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
11.11.2015, 14:54  [ТС] 11
Получилось. Но теперь пишет

C:\Users\engineer\Documents\Qt\sig_gen\mainwindow.cpp:21: ошибка: 'toBin' was not declared in this scope
a2 = toBin('A');
^
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCodec>
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString str = ui->textEdit->toPlainText();
    QTextCodec *koiCodec = QTextCodec::codecForName("KOI8-R");
    QByteArray data = koiCodec->fromUnicode(ui->textEdit->toPlainText());
 
    int a1[10];
 
    a1[0] = ui->lineEdit->text().toInt();
    a1[1] = 0;
    bool a2[5];
    quint32 a3 = toBin('A');
    //a2[0] = 1;
 
}
 
quint32 toBin(QChar c){
switch (c.unicode ()) {
case 'a': return 0x00001001U;
//...
return -1;
}
//---------------------------------------------------
}
 
MainWindow::~MainWindow()
{
 
    delete ui;
}
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
11.11.2015, 18:33 12
Ну правильно ругается: у тебя вызов функции quint32 toBin(QChar c) - строчка 21 - идёт до того, как она описана (строчка 26-31). Вставь прототип в начало файла:

quint32 toBin(QChar);
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
12.11.2015, 15:22  [ТС] 13
Получилось. А можно сделать результат функции в виде массива бит? Что я не так делаю? Как это сделать? Вот новый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCodec>
 
QBitArray toBin(QChar c){
switch (c.unicode ()) {
case 'a': return {1,0,0,1};
//...
//return -1;
}
//---------------------------------------------------
}
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString str = ui->textEdit->toPlainText();
    QTextCodec *koiCodec = QTextCodec::codecForName("KOI8-R");
    QByteArray data = koiCodec->fromUnicode(ui->textEdit->toPlainText());
 
    int a1[10];
 
    a1[0] = ui->lineEdit->text().toInt();
    a1[1] = 0;
    bool a2[5];
    QBitArray a3 = toBin('A');
    //a2[0] = 1;
int val = 3;
ui -> label_5 -> setText(QString::number(val));
 
}
 
MainWindow::~MainWindow()
{
 
    delete ui;
}
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.11.2015, 06:46 14
Массива бит? В принципе, можно, только кроме std::vector<bool> я таких типов не знаю. А он геморный, что песец.
Если напишите свой - на здоровье. Если нет, используйте строки QString с "0" и "1".

Всё в ваших руках.
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
13.11.2015, 11:59  [ТС] 15
У меня еще вопрос в том, что нужно очень быстро делать операции с массивом нулей и единиц. Qstring медленная, или я ошибаюсь? Мне проще тогда хоть int использовать, он же быстрее? Ну или что-нибудь хоть чуть-чуть покороче Почему byte геморный?
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.11.2015, 12:36 16
Смотря что вы подразумеваете под "быстро". И что вы с ними желаете делать.
Самая долгая операция - выделение памяти, её стоит делать заранее всякими reserve и тп.

Массив битов необходим, если у вас мало памяти или если это пойдёт на сериализацию (передача по сети, сохранение в файл и тп). Операции над битами, особенно всякие xor и тп - очень затратные получаются.

Если это обработка больших массивов данных, то следует проверить реализации. Все Q-контейнеры немного медленнее std-аналогов, а те, в свою очередь, медленнее boost-собратьев. Хотя все они меркнут перед хорошим Си. Но это должны быть действительно большие объмы данных, больше гигабайта текста при серьёзном ограничении времени.

Если это приложение для вывода результата пользователю, однозначно QString, меньше промежуточных операций. Сразу храните строковое представление, по байту на бит (то есть "0" и "1") (РАСТОЧИТЕЛЬНОСТЬ!!1!). Для небольших программ лишний объём данных будет незначителен в абсолютных величинах, и, как бы это ни было странным, будет схожая скорость: "прочитать в кеш и забыть" может оказаться эффективнее "читать, смещать и складывать".

Но это нужно вам решать.

P.S. Судя по вопросам, вам бы неплохо было вдумчиво изучить основы программирования, архитектуры ПК и дискретной математики со всякими алгоритмиками.
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
13.11.2015, 12:49  [ТС] 17
Да, я сейчас активно изучаю основы в том числе. Просто у меня есть опыт программирования на других языках на системном уровне, а тут я только месяц назад начал писать на C# что-то дельное, а вот теперь надо на C++ сделать программу, стараюсь
а насчет std::vector<bool> я не могу нигде найти, как добавлять туда данные, и как с него что-то считать. Может подскажете?

И да, мне обязательно нужно делать XOR с каждым битом, и не один раз - это раз. А во-вторых, нужно сравнивать каждый бит с каждым прошлым битом, сравнивать по 3 бита сразу... В общем, надо что-то такое, чтобы на уровне железа это было типа: запихал бит за битом, и к каждому отдельному биту обращаешься, а не адресуешь по 8...16...32 раза для чтения всего одного бита. Вот может что-то можете предложить?
0
683 / 458 / 160
Регистрация: 01.10.2015
Сообщений: 1,264
13.11.2015, 12:53 18
Цитата Сообщение от lennen Посмотреть сообщение
насчет std::vector<bool> я не могу нигде найти
http://ru.cppreference.com/w/cpp/container/vector
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
13.11.2015, 12:57  [ТС] 19
да вот эту сылку как раз и мусолил. Вроде же Insert? А как это в этом случае сделать?
C++
1
2
3
4
5
6
7
8
std::vector<bool> toBin(QChar c){
switch (c.unicode ()) {
case 'a': return {true,false,false,true};
//...
//return ;
}
//---------------------------------------------------
}
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
13.11.2015, 13:19 20
Никак. Даже С++14 очень плохо может в коллекции. Нужно заполнять поэлементно push_back или возвращать bool*, который будешь вставлять array.insert(array.end(), boolarray, boolarray+5). Хотя я так не извращался, понятия не имею, как это взлетит.
0
13.11.2015, 13:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2015, 13:19
Помогаю со студенческими работами здесь

Кодировка текста
Здравствуйте, не могу решить проблему, после выполнения программы using System; using...

кодировка текста
Доброго времени суток! подскажите, пожалуйста, у меня есть файл с расширением txt но там...

Кодировка текста
У меня вот появилась такая идейка написать кодировщик текста. То есть по такой схеме: английский...

Кодировка текста
Проблема заключается в том, что текст на русском языке кодируется некорректно. Если заносить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru