Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 5.00
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
#1

Как перевести строку в читабельный вид? - C++

11.02.2012, 12:58. Просмотров 4210. Ответов 56
Метки нет (Все метки)

Собственно из названия темы. Есть строка символов (к примеру такая: 0430002004370430043904340438)
Как перевести ее в читабельный вид, т.е в текст. Уже всю голову сломал Подскажите что прочитать(ссылочку если можно)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.02.2012, 11:39     Как перевести строку в читабельный вид? #31
Вот программа. В верхнее поле ввода вбиваем строку "0430002004370430043904340438", жмём кнопку "Convert", в нижнем поле читаем результат. Исходники, если кому-то интересно, прилагаются (у себя использовал borland builder 2007)
Вложения
Тип файла: rar sms-decoder.rar (224.5 Кб, 7 просмотров)
Тип файла: rar sms-decoder-src.rar (7.2 Кб, 6 просмотров)
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.02.2012, 11:40     Как перевести строку в читабельный вид? #32
Цитата Сообщение от dimmu Посмотреть сообщение
выбираю С++ - нет
Для Си++ надо явное преобразование указателей делать
-=ЮрА=-
Заблокирован
Автор FAQ
12.02.2012, 12:07     Как перевести строку в читабельный вид? #33
Evg, теперь я кажется понял
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
WideCharToMultiByte(CP_ACP
Цитата Сообщение от Evg Посмотреть сообщение
WideCharToMultiByte(
* * * * * * * * 1251,
Сейчас опробую свой код с преобразованием в CP_UTF, думаетя мне у меня строка ещё раз кодировалась
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
12.02.2012, 13:26  [ТС]     Как перевести строку в читабельный вид? #34
Цитата Сообщение от Evg Посмотреть сообщение
надо явное преобразование указателей делать
можно примерчик? никак не пойму что получиться должно
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.02.2012, 13:29     Как перевести строку в читабельный вид? #35
Цитата Сообщение от dimmu Посмотреть сообщение
можно примерчик? никак не пойму что получиться должно
Чтобы не играть в испорченный телефон, покажи код и покажи ошибку, которую выдаёт компилятор
-=ЮрА=-
Заблокирован
Автор FAQ
12.02.2012, 14:17     Как перевести строку в читабельный вид? #36
Цитата Сообщение от Evg Посмотреть сообщение
мне непонятно, как можно в цикле с большим количеством итераций загонять данные в массив из двух элементов. Не говоря уж о том, что тут вообще делается
- я делаю динамический realloc памяти в плюсах
всё просто изначально есть массив из 2-х элементов lpw, 1-й инициализировали а указатель на 2-й приравниваем адресу вновь выделяемого массива из 2-х элементом коим является add и так циклически расширяем размер блока. Ошибка у меня в преобразовании кода в код WCHAR
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
lpw[nchr] = code;
- получается что code = 430 а код WCHAR 1070, я уже сломал мозг как запихнуть коды в массив lpw
Миниатюры
Как перевести строку в читабельный вид?  
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
12.02.2012, 16:41  [ТС]     Как перевести строку в читабельный вид? #37
изначально
Код
error: cannot convert `char*' to `wchar_t*' for argument `1' to `char* unicode_to_1251(wchar_t*)'
с помощью MultiByteToWideChar пытаюсь перевести в wchar_t. Компилируется, но в файле несколько символов получается: = ???????

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
{
    char *res;
    FILE *fp;
    char str[] = {0x3D,0x04,0x20,0x00,0x3E,0x04,0x3A,0x04,0x39,0x04,0x34,0x04,0x38,0x04,0x00,0x00 };
    wchar_t *Whr=new wchar_t;
    MultiByteToWideChar(1251, 0, str,strlen(str),Whr,strlen(17));
    fp = fopen ("D:\\a.txt", "wt");
    fprintf (fp, "%s\n",unicode_to_1251 (Whr));
    fclose (fp);
    return 0;
}
Добавлено через 9 минут
mbstowcs() тоже самое
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.02.2012, 22:13     Как перевести строку в читабельный вид? #38
dimmu, в своём примере ты делаешь два преобразования, а нужно делать только одно. Правда я не осилил два последних параметра в вызове MultiByteToWideChar

Цитата Сообщение от dimmu Посмотреть сообщение
с помощью MultiByteToWideChar пытаюсь перевести в wchar_t
Конкретно на этот вопрос. Писать следует "MultiByteToWideChar (... (wchar_t*)str, ...)"
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
12.02.2012, 22:33  [ТС]     Как перевести строку в читабельный вид? #39
офтоп
Цитата Сообщение от dimmu Посмотреть сообщение
strlen(17)
сам только заметил

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
int MultiByteToWideChar(
__in UINT CodePage,
__in DWORD dwFlags,
__in LPCSTR lpMultiByteStr,
__in int cbMultiByte,
__out LPWSTR lpWideCharStr, - я так понимаю тут должен быть указатель на массив.или я не прав
__in int cchWideChar
);


Цитата Сообщение от Evg Посмотреть сообщение
ты делаешь два преобразования
что-то я не пойму ход Ваших мыслей как два
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
12.02.2012, 22:52     Как перевести строку в читабельный вид? #40
Цитата Сообщение от dimmu Посмотреть сообщение
я так понимаю тут должен быть указатель на массив.или я не прав
Я перепутал названия WideCharToMultiByte, который был в моём коде (который я содрал в инете) и MultiByteToWideChar

Цитата Сообщение от dimmu Посмотреть сообщение
что-то я не пойму ход Ваших мыслей как дв
В примере из поста #37 ты сначала вызываешь MultiByteToWideChar (к слову говоря, в качестве 5-го параметра ты подаёшь указатель на как бы массив из одного элемента), затем вызываешь unicode_to_1251, который содержит в себе WideCharToMultiByte.

И очень убедительная просьба. Не ленись тратить лишние 5 минут на то, чтобы чётко и внятно ставить вопросы. Потому что правильно поставленный вопрос - это уже половина ответа. А из твоих поставленных вопросов я даже проблему понять не могу, приходится что-то додумывать
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 08:48  [ТС]     Как перевести строку в читабельный вид? #41
Цитата Сообщение от Evg Посмотреть сообщение
сначала вызываешь MultiByteToWideChar
мне же нужно как-то получить wchar_t, что бы засунуть его в качестве аргумента в unicode_to_1251.
Или можно по другому сделать?
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
13.02.2012, 09:11     Как перевести строку в читабельный вид? #42
Цитата Сообщение от dimmu Посмотреть сообщение
мне же нужно как-то получить wchar_t, что бы засунуть его в качестве аргумента в unicode_to_1251
То, что из себя представляет твоя строка цифр - это изначально является массивом из wchar_t. Разумеется, если трактовать её как набор байтов (набор пар байтов), а не как строку из цифр. В исходнике из поста #31 там даже в комментарии об этом написано.

Для понятности пример из поста #13 следовало переписать так:

вместо

C
1
2
char str[] = { 0x30, 0x04, 0x20, 0x00, 0x37, 0x04, 0x30, 0x04,
               0x39, 0x04, 0x34, 0x04, 0x38, 0x04, 0x00, 0x00 };
написать

C
1
wchar_t str[] = { 0x0430, 0x0020, 0x0437, 0x0430, 0x0439, 0x0434, 0x0438, 0x0000 };
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 09:37  [ТС]     Как перевести строку в читабельный вид? #43
кажется работает. Огромное Вам СПАСИБО
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:23     Как перевести строку в читабельный вид? #44
dimmu, всё же я доделал вариант из поста 19, мой недочёт был в том что 430 была 16-ричная а не десятичная запись WCHAR и 430Hex == 1072 что в UTF-8 соответсвует символу 'a' русское. Ниже скрин, код и готовый проект на плюсах, который переводит ваш текст \u0430\u0020\u0437\u0430\u0439\u0434\u0438
Для упрощения вводу - строку текста SMS-ки помещаем в файл sms.txt котрый и на экране а также в файле out.txt получаем готовый текст
Код С++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <windows.h>
#include <iostream>
#include <fstream>
#include <clocale>
#include <string>
#include <cmath>
using namespace std;
 
char * Utf2Ascii(WCHAR*lpw)
{
    long uLen = WideCharToMultiByte(CP_ACP, 0, lpw,   -1,  NULL, NULL, NULL, NULL);
    char *str = new char[uLen];
                WideCharToMultiByte(CP_ACP, 0, lpw, uLen,  str , uLen, NULL, NULL);
    return str;
}
//Г*        ' ' a+7  a     a+9  a+4  a+8
//0430 0020 0437 0430 0439 0434 0438
int getHEXCode(int code)
{
    int ipow = 0;
    int iHEX = (code%10);
    while(0 <  (code /= 10))
    {
        ipow += 1;
        iHEX += (code%10)*pow(16,1.0*ipow);
    }
    return iHEX;
}
 
int main()
{
    //setlocale(LC_ALL, "Russian");
    system("chcp 1251");
    string text;
    string line;
    WCHAR  *lpw = new WCHAR[2];
    WCHAR  *add = 0;
    char * sout = 0;
    long fpos = -1;
    long code = -1;
    long nchr = 0;
    ofstream ofs;
    ifstream ifs("sms.txt");
    if(!ifs)
        cout<<"ГЌГҐ ìîãó îòêðûòü sms.txt\n";
    else
    {
        while(getline(ifs,line))
            text += line;
        ifs.close();
        cout<<"Г„Г*Г*Г*ûå ГґГ*éëГ* :\n"<<text<<endl;
        while((fpos = text.find("\\u",fpos + 1)) != -1)
        {
            line = text.substr(fpos + 2,4);
            code = atoi(line.c_str());
            lpw[nchr] = getHEXCode(code);
            nchr++;
            //ÄèГ*Г*ìè÷åñêè Г*ëî÷èì ГЇГ*ìÿòü äëÿ lpw
            add = new WCHAR[2];
            lpw[nchr] = add[0];
        }
        lpw[nchr] = 0;
        if(!(sout = Utf2Ascii(lpw)))
            cout<<"ГЋГёГЁГЎГЄГ* ïðåîáðГ*çîâГ*Г*ГЁГї\n";
        else
        {
            cout<<"ÏðåîáðГ*çîâГ*Г*Г*ûå Г¤Г*Г*Г*ûå :\n"<<sout<<endl;
            ofs.open("out.txt");
            if(!ofs)
                cout<<"ГЌГҐ ìîãó ñîçäГ*ГІГј ГґГ*éë out.txt\n";
            else
                ofs<<sout;
            if(ofs)
                ofs.close();
            delete [] sout;
        }
    }
    system("pause");
    return 0;
}


Вот и всё что добавили в изначальный алгоритм
C++
1
2
3
4
5
6
7
8
9
10
11
int getHEXCode(int code)
{
    int ipow = 0;
    int iHEX = (code%10);
    while(0 <  (code /= 10))
    {
        ipow += 1;
        iHEX += (code%10)*pow(16,1.0*ipow);
    }
    return iHEX;
}

Не по теме:

PS:Также предлагаю читающим этот пост обратить внимание на realloc в стиле плюсов

C++
1
2
add = new WCHAR[2];
lpw[nchr] = add[0];
(в разделе экспертов рассматривали рассматривали и так никто и не привёл такой вариант выделения памяти)

Миниатюры
Как перевести строку в читабельный вид?  
Вложения
Тип файла: txt sms.txt (42 байт, 10 просмотров)
Тип файла: rar SMS2Hex.exe.rar (69.6 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 11:27     Как перевести строку в читабельный вид?
Еще ссылки по теме:
перевести с турбо паскаля в с++ вид C++
Как перевести получившееся число целого типа в строку? C++
Перевести длинное целое число в двоичный вид C++
C++ Преобразование типов - как строку чисел перевести в целочисленный массив ?
Перевести длинную бинарную строку в строку с десятичными цифрами C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:27     Как перевести строку в читабельный вид? #45
А и да ещё одно дополнение - руссификацию консольного вывода проводил с помощью system("chcp 1251"); поэтому если при первом запуске вылезет билеберда с русским(как на скрине) то нужно всего лишь произвести настройку шрифта консоли - как это сделать см ссылку
Создание файла в UTF-8 кодировке
Миниатюры
Как перевести строку в читабельный вид?  
Yandex
Объявления
13.02.2012, 11:27     Как перевести строку в читабельный вид?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru