Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191

Qt битовый поток в текст

23.09.2016, 09:40. Показов 5501. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи! Застрял вроде бы на элементарной вещи. У меня есть битовый поток, который я получил различными преобразованиями. Я знаю что текст должен быть в конкретной кодировке(Big5). если просто файл экспортирую в текстовый через QTextStream то он добавляет к каждому биту еще 7 бит, как я понимаю служебных относящихся к кодировке ASCII
C++ (Qt)
1
2
3
4
 QString out = ui->textEdit_2nd->toPlainText();
            QTextStream stream(&file_s);
            stream <<out;
            stream.flush();
если после этого удалить эти 7 бит и преобразовать в кодировку Big5, то появляются иероглифы. Именно то, что мне надо получить.

Значит нам надо правильно считать этот массив бит и распределить по байтам:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
            for(int offset = 0;offset<in.length();offset+=16)
            {
                bool ok(false);
                const char c = static_cast<const char>(in.mid(offset,16).toLong(&ok,2));
 
                if(ok)
 
                    out.append(c);
 
                else
                    qDebug() <<"error" <<in.mid(offset,16);
            }
Как я понял в BIG5 каждый символ кодируется 16 битами(4 байтами)(хотя я пытался и с 8 вместо 16 бит).
Далее если мы используем QDataStream, он добавляет какие-то служебные символы, что мне вообщем то не нужно.
Поэтому либо работать с Qfile на прямую, либо через QTextStream. Там есть прекрасная функция codec. Делаю так:
C++ (Qt)
1
2
3
4
5
6
           QTextCodec *jap = QTextCodec::codecForName("Big5");
           QByteArray eStr = jap->fromUnicode(out);
           QTextStream stream(&file_s);
           stream.setCodec("Big5");
           stream <<out;
           stream.flush();
однако на выходе все равно показывает что файл в кодировке ascii. и все в знаках вопроса. Подскажите как обойти данную неприятность?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2016, 09:40
Ответы с готовыми решениями:

Arduino мониторит битовый поток
Здравствуйте. Начал изучать Ардуино и решил применить его для работы (работаю телемехаником), а именно с его помощью просматривать...

Перевод кода в битовый поток
Объясните и помогите пожалуйста написать программу которая будет переводить слово или предложения в кодировке ASCII в битовый поток,...

Передать текст в поток
Написал программку(на СИ под OC Ubuntu), которая в строке ищет подстроку с помощью алгоритма КПМ. Никак не могу разобраться с функцией...

34
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.09.2016, 13:52
Лучший ответ Сообщение было отмечено crush91 как решение

Решение

Студворк — интернет-сервис помощи студентам
Хорошо, приведу тебе немного изменённый код с комментариями.
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
34
void MainWindow::on_pushButton_save_as_clicked() 
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить как"),
                               "",
                               tr("Все файлы (*.*)"));
    if (fileName != "")
    {
        QFile file_s(fileName);
        if (!file_s.open(QIODevice::WriteOnly))  {
            QMessageBox msgBox;
            msgBox.setText("Ошибка прав записи файла");
            msgBox.setWindowTitle("Ошибка");
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
        } else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0) // тут будет текст в формате Big5
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&bool, 2));
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
                    return;
                }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
       }
    file_s.write(bytes); // тут будет записан текст в формате Big5
    }
}
1
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
23.09.2016, 14:10  [ТС]
Толи лыжи не едут...
Цитата Сообщение от Wyn Посмотреть сообщение
Хорошо, приведу тебе немного изменённый код с комментариями.
одной закрывающейся скобки не хватает..
C++ (Qt)
1
}
в следствии чего ругается на кучу параметров
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
34
35
36
37
38
39
40
41
42
43
44
mainwindow.cpp: In member function 'void MainWindow::on_pushButton_save_as_clicked()':
mainwindow.cpp:176:64: error: conversion from 'QString' to non-scalar type 'QByteArray' requested
             QByteArray bitBytes = ui->textEdit_2nd->toPlainText(); // РІ ui->textEdit_2nd должны отображаться только нули Рё единицы
                                                                ^
mainwindow.cpp:177:81: error: invalid conversion from 'int' to 'const char*' [-fpermissive]
             QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0), // тут будет текст РІ формате Big5
                                                                                 ^
In file included from C:/Qt/5.7/mingw53_32/include/QtCore/qstring.h:49:0,
                 from C:/Qt/5.7/mingw53_32/include/QtCore/qobject.h:47,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qwidget.h:44,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qmainwindow.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/QMainWindow:1,
                 from mainwindow.h:4,
                 from mainwindow.cpp:1:
C:/Qt/5.7/mingw53_32/include/QtCore/qbytearray.h:183:5: note:   initializing argument 1 of 'QByteArray::QByteArray(const char*, int)'
     QByteArray(const char *, int size = -1);
     ^
mainwindow.cpp:178:13: error: expected unqualified-id before 'for'
             for (int i = 0, count = bytes.size(); i < count; ++i) {
             ^
mainwindow.cpp:178:51: error: 'i' was not declared in this scope
             for (int i = 0, count = bytes.size(); i < count; ++i) {
                                                   ^
mainwindow.cpp:178:55: error: 'count' was not declared in this scope
             for (int i = 0, count = bytes.size(); i < count; ++i) {
                                                       ^
mainwindow.cpp:178:55: note: suggested alternative:
In file included from C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++/algorithm:62:0,
                 from C:/Qt/5.7/mingw53_32/include/QtCore/qglobal.h:94,
                 from C:/Qt/5.7/mingw53_32/include/QtGui/qwindowdefs.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qwidget.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qmainwindow.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/QMainWindow:1,
                 from mainwindow.h:4,
                 from mainwindow.cpp:1:
C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/stl_algo.h:3959:5: note:   'std::count'
     count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
     ^
mainwindow.cpp:300:42: error: qualified-id in declaration before '(' token
 void MainWindow::on_action_more_triggered()
                                          ^
mainwindow.cpp:310:1: error: expected '}' at end of input
 }
 ^
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.09.2016, 14:22
Цитата Сообщение от crush91 Посмотреть сообщение
одной закрывающейся скобки не хватает..
Да, ты прав. Поставь её после
C++ (Qt)
1
2
3
4
if (!ok) {
   qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
   return;
}
0
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
23.09.2016, 14:39  [ТС]
Цитата Сообщение от Wyn Посмотреть сообщение
Да, ты прав. Поставь её после
Это мало что изменило((
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
34
35
36
37
38
39
40
41
mainwindow.cpp: In member function 'void MainWindow::on_pushButton_save_as_clicked()':
mainwindow.cpp:176:64: error: conversion from 'QString' to non-scalar type 'QByteArray' requested
             QByteArray bitBytes = ui->textEdit_2nd->toPlainText(); // РІ ui->textEdit_2nd должны отображаться только нули Рё единицы
                                                                ^
mainwindow.cpp:177:81: error: invalid conversion from 'int' to 'const char*' [-fpermissive]
             QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0) // тут будет текст РІ формате Big5
                                                                                 ^
In file included from C:/Qt/5.7/mingw53_32/include/QtCore/qstring.h:49:0,
                 from C:/Qt/5.7/mingw53_32/include/QtCore/qobject.h:47,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qwidget.h:44,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qmainwindow.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/QMainWindow:1,
                 from mainwindow.h:4,
                 from mainwindow.cpp:1:
C:/Qt/5.7/mingw53_32/include/QtCore/qbytearray.h:183:5: note:   initializing argument 1 of 'QByteArray::QByteArray(const char*, int)'
     QByteArray(const char *, int size = -1);
     ^
mainwindow.cpp:178:13: error: expected ',' or ';' before 'for'
             for (int i = 0, count = bytes.size(); i < count; ++i) {
             ^
mainwindow.cpp:178:51: error: 'i' was not declared in this scope
             for (int i = 0, count = bytes.size(); i < count; ++i) {
                                                   ^
mainwindow.cpp:178:55: error: 'count' was not declared in this scope
             for (int i = 0, count = bytes.size(); i < count; ++i) {
                                                       ^
mainwindow.cpp:178:55: note: suggested alternative:
In file included from C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++/algorithm:62:0,
                 from C:/Qt/5.7/mingw53_32/include/QtCore/qglobal.h:94,
                 from C:/Qt/5.7/mingw53_32/include/QtGui/qwindowdefs.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qwidget.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/qmainwindow.h:43,
                 from C:/Qt/5.7/mingw53_32/include/QtWidgets/QMainWindow:1,
                 from mainwindow.h:4,
                 from mainwindow.cpp:1:
C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/stl_algo.h:3959:5: note:   'std::count'
     count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
     ^
mainwindow.cpp:193:18: error: 'bytes' was not declared in this scope
     file_s.write(bytes); // тут будет записан текст РІ формате Big5[quote="Wyn;9570202"]QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0) // тут будет текст в формате Big5
* * * * * * for (int i = 0, count = bytes.size(); i < count; ++i)[/quote]
не понимаю вот этого:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0) // тут будет текст в формате Big5
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&bool, 2));
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
                    return;
                }
            }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
       }
как сейчас выглядит код:
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
34
35
void MainWindow::on_pushButton_save_as_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить как"),
                               "",
                               tr("Все файлы (*.*)"));
    if (fileName != "")
    {
        QFile file_s(fileName);
        if (!file_s.open(QIODevice::WriteOnly))  {
            QMessageBox msgBox;
            msgBox.setText("Ошибка прав записи файла");
            msgBox.setWindowTitle("Ошибка");
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
        } else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0) // тут будет текст в формате Big5
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&bool, 2));
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
                    return;
                }
            }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
       }
    file_s.write(bytes); // тут будет записан текст в формате Big5
    }
}
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.09.2016, 15:06
Цитата Сообщение от crush91 Посмотреть сообщение
как сейчас выглядит код:
Измени на QByteArray bitBytes = ui->textEdit_2nd->toPlainText().toLatin1();
QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0, ' ');

file_s.write(bytes);
перенеси к QString chinaStr = codec->toUnicode(bytes);
0
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
23.09.2016, 15:44  [ТС]
Цитата Сообщение от Wyn Посмотреть сообщение
Измени на QByteArray bitBytes = ui->textEdit_2nd->toPlainText().toLatin1();
QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0, ' ');
file_s.write(bytes); перенеси к QString chinaStr = codec->toUnicode(bytes);
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
34
35
36
void MainWindow::on_pushButton_save_as_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить как"),
                               "",
                               tr("Все файлы (*.*)"));
    if (fileName != "")
    {
        QFile file_s(fileName);
        if (!file_s.open(QIODevice::WriteOnly))  {
            QMessageBox msgBox;
            msgBox.setText("Ошибка прав записи файла");
            msgBox.setWindowTitle("Ошибка");
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
        } else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText().toLatin1(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0, ' '); // тут будет текст в формате Big5
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&bool, 2));
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
                    return;
                }
            }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
           file_s.write(bytes); // тут будет записан текст в формате Big5
       }
 
    }
}
не собираетсяругается на
C++ (Qt)
1
2
 bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&bool, 2));
заменил на
C++ (Qt)
1
2
 bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toInt(&ok, 2));
компилится, но при сохранении ошибка
C++ (Qt)
1
2
shell\comdlg32\fileopensave.cpp(14262)\comdlg32.dll!76BE2487: (caller: 76C11B7C) ReturnHr(1) tid(f30) 80004005 Неопознанная ошибка
    CallContext:[\PickerModalLoop]
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.09.2016, 16:10
Цитата Сообщение от crush91 Посмотреть сообщение
компилится, но при сохранении ошибка
Воспользуйся дебаггером и посмотри из-за чего она появляется.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
23.09.2016, 16:20
Цитата Сообщение от crush91 Посмотреть сообщение
16 битами(4 байтами)
интересное заявление
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
24.09.2016, 00:20
Я взял 1 и 0 из файла по 8 штук, сделал из них байты, сбросил в текстовый файл:

Єz2-4 ЇаЁЈ«Ч:10
¶і¶q:w ¤j®рАЈ¤O/:1033 R+-:0.3 P+-.1
®ь¬ф·Н«Ч:B34 їз®g°»АЛ*И:0.q1 іМ¬j°}*·:6
°Щ2Ь”ћЅ¦}m—†ћ {8Gб±,э‡н„ят>(uѕї.БЁJИ№ж/яWф!Ирtк_XgnяиVшшшшшшшшшшшшшшшшшшшшшшшш шшшшшшшшшшшшшЬЄ:2-4 ЇаЁЈ«Чz10
¶і¶q:7`¤j®рАЈ¤Oo:1011 R+-:0.3 P+-:0.1
®э¤ф·Н«Ч:B34 їз®з°»АЛ*И:0.11 іЬ¤j°}*·:6
°ЩКћ†—ШдОт8€<бт]“хЂiBћ=ЗS,›єиФКmЁСфZ
xHТзH«}CO©КУvњwxИшlш>е#'®G”юь‰ЯHг*ОЅфІ Я0>6p’ЛяЦытR}Бњ7dзщыЏѕ–ЅxNЯ *ід‡{Ncхчь!K<аOвЮm2%ќ¤
4+b0шшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшЬ-------------------------------
TO:1206(·РЅРЁу§UҐNВаД¬ѕФЎBДҐѕџЄ:2-4 ЇаЁЈ«Ч:10
¶і¶q:7 ¤j®рАЈ¤O/:1011 R+-:0.3 P+-:0.1
®ь¤ф·Е«Ч:B34 їз®g°»АЛ*И:0.11 іМ¤j°}*·:6
°ЩЇнЯСДуМXс·eю"ъЈ„|'дТ–)дЇи&јOYzo ь_ЃЏзД 1БXHњ{+K;SOєИXК`9бѕ|cE9v—‚&Њ?јюѕ/я?ђSMю–g#:#{„¬@©ОЉv!9ї ’жМ0]XwаіЁ©К[¤Н’Я†/Џю±A*t&пцяЧҐЪУћЪ\ ъ
{‡яХkiЙgz?аи8эщщщшщщщщщшщщшщщщщщщщщщщшшЬ =ommmТ§cuвV_nQЈbRЯOч|n(Х=љ0WрФСХлЅ8?: 1013 Т+-o3 Рk-:0.1®эҐф·Е«ЧєF3t`їпЇo±їАЫ*Ш.13 іЭ¤z°}няє6№ЭП.хХК ®њjB*XKыЎgи€{mє0Љ¶Чэ
ЖЪ_ЗзЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗшшшш Ь cЏ=cЏ @TЯ:8Г (·РЅСҐNВа62.i

Ґ»Ґx¤ч¦¬±x°ЄіtёХ©®«HҐе
m-------------------------------m--^‘Ѓ±Eѕ…о…Oќ:**v%eцҐ
moфяwЖа&*
®Н¶ЎU-15p0
¬¬µшЇБ°кq05¦~5¤л39¤л†`Ф-s6pp®р¶H
ёgЅn«Ч:2306uw^s3434U07E
Їй®VzІ70#Їиіt:6nr *·оV:306cі*··tz4mu
¬щ®Цz06y ¬щ·tzs.y "®ц±єzq033 Rk-z0.w`Q+-.s
®ь¬ф·Н«Ч:Ж34aїз®o±»АЫ*ИzpnssaіН¬к°э*їz~ µы°·ѓF‡FЄ-{Pkn.XnulЬйMп~woмШЊЊМофv¶\ё№cёХіsЅїµ h 0vs0xЮ`1370we Г`Јѓ™mРмчпн~я}i•‡О*›џняПѓѓ±›Џ0ЖцSR8 {шаг{ьЪь;яo„ЗэА НN]¶АЋ s|ъp*J
ЁЮО†СJkЊЃ|ѕэЌє·Ч5ЂЁgЬЎЏх ”ў $?яяяяяяяяяяяяяяяяяяяяяяяяя‹°зџї.яЮопЏх ¶зpАmџэ™ЯwяѕЙџїпћ?c5O\ъo{џџoѕk;<{ьпя вdзрd[ЙЄ^†*З-3©¬§™бД|µсSµаи4ќЁAЩed47Ѕтйсшшшшшшшш щшшшшшшшшшшшшшшшшшшшшшшшшЬ cЏ=cЏ @TO:8C (·РЅРҐNВа62.1єXД)
Кодировка автоматически не определилась.
0
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
24.09.2016, 05:12  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
интересное заявление
да, ошибся))

Добавлено через 6 минут
Цитата Сообщение от alexu_007 Посмотреть сообщение
Я взял 1 и 0 из файла по 8 штук, сделал из них байты, сбросил в текстовый файл:
приведи код пожалуйста

Добавлено через 54 секунды
Цитата Сообщение от Wyn Посмотреть сообщение
Воспользуйся дебаггером и посмотри из-за чего она появляется.
C++ (Qt)
1
2
3
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
           file_s.write(bytes); // тут будет записан текст в формате Big5
           qDebug()<<chinaStr << bytes;
оба фала пустые

Добавлено через 27 минут
Цитата Сообщение от crush91 Посмотреть сообщение
QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8) ? 1 : 0, ' ');
не знаю зачем нужны были последние параметры
C++ (Qt)
1
? 1 : 0
, но когда их убрал все получилось) Большое спасибо всем


Добавлено через 1 минуту
Цитата Сообщение от alexu_007 Посмотреть сообщение
Кодировка автоматически не определилась.
Если открыть через notepad++ или ворд, он адекватно определит кодировку,
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
24.09.2016, 08:59
Цитата Сообщение от crush91 Посмотреть сообщение
приведи код пожалуйста
Добавлено через 54 секунды
Сам напиши, ты программист или где?

Если открыть через notepad++ или ворд, он адекватно определит кодировку,
MS Word да, определил кодировку как китайская. На мой взгляд те же кракозябры, только в виде иероглифов. Хотя, может че то осмысленное тут есть:
Миниатюры
Qt битовый поток в текст  
0
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
24.09.2016, 10:44  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Хотя, может че то осмысленное тут есть:
не, не правильная кодировка выбрана.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сам напиши, ты программист или где?
уже написал, а вообще я *или где* пока что.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
24.09.2016, 19:56
Цитата Сообщение от alexu_007 Посмотреть сообщение
Кодировка автоматически не определилась.
Она и не должна автоматически определяться. Тебе нужно в ручном режиме указать текстовому редактору, какая именно кодировка в том файле, который он открыл. Иначе никак.

Добавлено через 1 минуту
Цитата Сообщение от crush91 Посмотреть сообщение
Если открыть через notepad++ или ворд, он адекватно определит кодировку,
Не факт. У них есть конечно определённая эвристика определения кодировок, но она не всегда работает.

Добавлено через 15 минут
Цитата Сообщение от crush91 Посмотреть сообщение
не знаю зачем нужны были последние параметры
На всякий случай. Может у тебя там ошибка была, что символ '\0' не читало. Но тогда у тебя там должна была соответствуюшая строка qCritical высвечиваться в логе.

Попробуй этот код: Я как-то позабыл, что китайщина не 8бит, а 16ть.
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
34
35
36
void MainWindow::on_pushButton_save_as_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить как"),
                               "",
                               tr("Все файлы (*.*)"));
    if (fileName != "")
    {
        QFile file_s(fileName);
        if (!file_s.open(QIODevice::WriteOnly))  {
            QMessageBox msgBox;
            msgBox.setText("Ошибка прав записи файла");
            msgBox.setWindowTitle("Ошибка");
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
        } else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText().toLatin1(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 16, ' '); // тут будет текст в формате Big5
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(16 * i, 16).toInt(&ok, 2));
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(16 * i, 16)));
                    return;
                }
            }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
           // ради того, чтобы каждый раз не бегать с файлом, выводи chinaStr в какой-нибудь textEdit. Там сразу должны быть китайские символы.
           file_s.write(bytes); // тут будет записан текст в формате Big5
       }
    }
}
1
34 / 26 / 8
Регистрация: 24.03.2015
Сообщений: 191
25.09.2016, 06:27  [ТС]
Цитата Сообщение от Wyn Посмотреть сообщение
Попробуй этот код: Я как-то позабыл, что китайщина не 8бит, а 16ть.
Не, по 2 байта вообще трешь выводит. Даже цифры глотает. 1 байт норм, читабельный текст.
вот рабочий вариант:
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
34
35
36
37
38
39
40
41
42
void MainWindow::on_pushButton_save_as_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить как"),
                               "",
                               tr("Все файлы (*.*)"));
    if (fileName != "")
    {
        QFile file_s(fileName);
        if (!file_s.open(QIODevice::WriteOnly))  {
            QMessageBox msgBox;
            msgBox.setText("Ошибка прав записи файла");
            msgBox.setWindowTitle("Ошибка");
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
        } else {
            QByteArray bitBytes = ui->textEdit_2nd->toPlainText().toLatin1(); // в ui->textEdit_2nd должны отображаться только нули и единицы
            QByteArray bytes(bitBytes.size() / 8 + (bitBytes.size() % 8), ' '); // тут будет текст в формате Big5
 
 
 
 
            for (int i = 0, count = bytes.size(); i < count; ++i) {
                bool ok = false;
                bytes[i] = static_cast<char>(bitBytes.mid(8 * i, 8).toLong(&ok, 2));
 
                if (!ok) {
                    qCritical("Cannot convert %s to int", qUtf8Printable(bitBytes.mid(8 * i, 8)));
                    return;
                }
            }
           QTextCodec* codec = QTextCodec::codecForName("Big5");
           if (!codec) {
                qCritical("Codec Big5 not found");
                return;
           }
           QString chinaStr = codec->toUnicode(bytes); // тут будут китайские символы в формате unicode
           file_s.write(bytes); // тут будет записан текст в формате Big5
            ui->textEdit_1st->setText(chinaStr);
       }
 
    }
}
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
25.09.2016, 09:51
Цитата Сообщение от crush91 Посмотреть сообщение
+ (bitBytes.size() % 8)
Убери, оно лишнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2016, 09:51

Битовый сдвиг
Вот в чем вопрос: int x = 2; int y; y = (x &gt;&gt; 32); cout &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; y; Должен быть выход 2 0, а на экран...

Битовый сдвиг
скажем так, дан массив из 4-х элементов (1100) , нужно выполнить сдвиг влево/вправо на 2 бита. у меня выводит (0000), как это...

8 битовый формат
Доброго времени суток. Подскажите как вывести 2-чное число в 8-битовом формате (последние 8 чисел).

Битовый класс
Одно время очень нужен был битовый класс для C# ... но облазив весь интернет найти такого у меня не получилось =( Очень огорчившись начал...

битовый сдвиг
ребят, кому не лень, помогите пожалуйста! помогите дописать программу. сейчас она выводит двоичный код float числа, например 01001100111....


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru