Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
1

Char* в число по ASCII кодам

18.01.2015, 12:57. Просмотров 1224. Ответов 31
Метки нет (Все метки)

Здравствуйте!
Подскажите, пожалуйста, есть ли какой то быстрый способ перевести char* в число по ASCII кодам
Например у меня есть:
C++
1
char* text = "text";
Количество значений в переменной text я знаю заранее. Если это что то изменит то переменная может быть объявлена по другому - string, char[].
И мне нужно получить из этой переменной число. Что то вроде 1952807028.
Я делал через string и for'ом перебирал весь массив и делал сдвиги вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
long long ASCIIStringToNum(string s)
{
    int lenStr = s.length();
    long long num = 0;
    for (int i = 0; i < lenStr; i++)
    {
        unsigned char c = s[i];
        num <<= 8;
        num += c;
    }
    return num;
}
Но это выполняется очень долго. Может кто-нибудь знает более быстрый способ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2015, 12:57
Ответы с готовыми решениями:

ASCII, char
Подходит ли для определений символов типа char таблица...

масив Char (Windows-1251, ASCII, UTF-8)
Перехожу с мелкомяхких на linux (с Delphi на С++), так как все мои программы...

Зашифровать строку Char, заменив каждый символ на его ASCII код
Собственное весь вопрос в заголовке темы. Вся задача. Весь код. ...

Необходимо записать в пустую строку число (ASCII код)
Следующая программа должна во введенной строке заменять все согласные буквы на...

Как получить число в текстовом десятичном виде (!) в кодировке ASCII?
ответ к задаче мне надо представить в файле .txt. Ответ должен представлять не...

31
kaznachei67
27 / 27 / 15
Регистрация: 17.03.2014
Сообщений: 103
18.01.2015, 13:20 2
Попробуйте так:
C++
1
2
3
4
    string s = "Text";
    int a = 0;
    for (int i = 0; i < s.length(); i++)
        a += static_cast<int>(s.at(i));
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 13:31 3
Цитата Сообщение от Ghostman23 Посмотреть сообщение
C++
1
2
num <<= 8;
 num += c;
Если в строке что-то типа "123" то это неверно. Надо
C++
1
num*=10; num+=c-'0';
0
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 13:35  [ТС] 4
Это да, но у меня может быть любой текст в строке.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
18.01.2015, 13:38 5
Цитата Сообщение от Ghostman23 Посмотреть сообщение
Но это выполняется очень долго.
Ты на калькуляторе эти действия выполняешь?
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 13:39 6
Цитата Сообщение от Ghostman23 Посмотреть сообщение
по ASCII кодам
Какой смысл ТС вкладывает в "ASCII-код" (имхо, он сам не знает, чего хочет)

Цитата Сообщение от castaway Посмотреть сообщение
Ты на калькуляторе эти действия выполняешь?
Интересно, что это за задача, где перевод строки в число выполняется долго . Обычно сам перевод - малая доля времени от решения всей задачи.
0
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 13:45  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
Ты на калькуляторе эти действия выполняешь?
Цитата Сообщение от zer0mail Посмотреть сообщение
Интересно, что это за задача, где перевод строки в число выполняется долго . Обычно сам перевод - малая доля времени от решения всей задачи.
Мне важна каждая миллисекунда, а как раз на этом переводе теряется много времени.

Добавлено через 2 минуты
Цитата Сообщение от zer0mail Посмотреть сообщение
Какой смысл ТС вкладывает в "ASCII-код" (имхо, он сам не знает, чего хочет)
А что есть несколько смыслов? Код символа вот и весь смысл.
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 13:48 8
1. миллисекунда важна, а правильность - нет?
2. пиши на ассеблере
3. все-таки - что это за задача ?

Добавлено через 1 минуту
Цитата Сообщение от Ghostman23 Посмотреть сообщение
А что есть несколько смыслов? Код символа вот и весь смысл.
Я уже писал, что в этом случае сдвиг и суммирование неправильны, но вы начали оспаривать и написали "по ASCII кодам"
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
18.01.2015, 13:50 9
Если бы ты сказал для чего это нужно, тогда возможно можно было бы придумать что-нибудь быстрее.
0
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 13:57  [ТС] 10
Цитата Сообщение от zer0mail Посмотреть сообщение
1. миллисекунда важна, а правильность - нет?
2. пиши на ассеблере
3. все-таки - что это за задача ?
1.В чём не правильность?
2. Ассемблера не знаю, и как то пока не хочу изучать.
3. Задача такая: пользователь вводит строку или происходит двоичное считывание из файла в строковую переменную. Затем эту переменную мне надо получить как число и провести с ним некоторое преобразование(шифрование) и записать двоично в файл.
Не обязательно получение всей переменной как числа, а например по 64-бит(8 символов).

Добавлено через 6 минут
Цитата Сообщение от zer0mail Посмотреть сообщение
Я уже писал, что в этом случае сдвиг и суммирование неправильны, но вы начали оспаривать и написали "по ASCII кодам"
В чём именно не правильность? Я не понимаю.
Вы написали только то что если в строке будет "123", то это не правильно. А как тогда правильно? Если у меня может быть "123", а может быть "some text".
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 14:01 11
Цитата Сообщение от Ghostman23 Посмотреть сообщение
В чём именно не правильность? Я не понимаю.
Неправильность в том, что если числа в ASCII-кодах, то сдвиг+суммирование не подходят. А если это просто байты (и сдвиг подходит), то фраза "число по ASCII кодам" бессмысленна (ASCII коды тут не при чем).
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
18.01.2015, 14:07 12
Цитата Сообщение от Ghostman23 Посмотреть сообщение
Задача такая: пользователь вводит строку или происходит двоичное считывание из файла в строковую переменную. Затем эту переменную мне надо получить как число и провести с ним некоторое преобразование(шифрование) и записать двоично в файл.
Зачем тут строка? Читай сразу в переменную!
C++
1
2
    long long value;
    fread( &value, sizeof( value ), 1, fp );
А лучше большими кусками в массив переменных.
0
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 14:13  [ТС] 13
Цитата Сообщение от zer0mail Посмотреть сообщение
Неправильность в том, что если числа в ASCII-кодах, то сдвиг+суммирование не подходят. А если это просто байты (и сдвиг подходит), то фраза "число по ASCII кодам" бессмысленна (ASCII коды тут не при чем).
C++
1
2
char c = 'a';
cout << (int)c;
Я получаю ASCII код символа 'a' или я не прав?

Добавлено через 4 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Зачем тут строка? Читай сразу в переменную!
А как мне в этом случае контролировать сколько бит записывается в число? Допустим если мне надо считывать по 32-бита(Шифрование 32-битное).
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 14:17 14
Вижу, у вас проблемы с тем, чтобы
1. Заголовок темы соответствовал ее содержанию
2. Содержание ясно описывало решаемую задачу (даже за 14 сообщений это не достигнуто)
3. char c = 'a'; cout << (int)c; получает ASCII код, но
char c = 'я'; cout << (int)c; получает не ASCII код.

Честно говоря, мне уже неинтересно (лимит исчерпан, так сказать).
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
18.01.2015, 14:19 15
Цитата Сообщение от Ghostman23 Посмотреть сообщение
А как мне в этом случае контролировать сколько бит записывается в число?
C++
1
2
    uint32_t value;
    fread( &value, sizeof( value ), 1, fp );
Тип uint32_t всегда имеет размер 32 бита.
0
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 15:10  [ТС] 16
Цитата Сообщение от zer0mail Посмотреть сообщение
Вижу, у вас проблемы с тем, чтобы
1. Заголовок темы соответствовал ее содержанию
2. Содержание ясно описывало решаемую задачу (даже за 14 сообщений это не достигнуто)
3. char c = 'a'; cout << (int)c; получает ASCII код, но
char c = 'я'; cout << (int)c; получает не ASCII код.
Честно говоря, мне уже неинтересно (лимит исчерпан, так сказать).
Так это вы развели всю эту муру с бесполезными сообщениями.
А вот так можно получить ASCII код:
C++
1
unsigned char c = 'я'; cout << (int)c;
В самом первом сообщении у меня так и написано.

Добавлено через 7 минут
Цитата Сообщение от castaway Посмотреть сообщение
Тип uint32_t всегда имеет размер 32 бита.
Просто мне, на самом деле, нужны большие числа 128-256-битные, поэтому стандартные типы не подходят. Я использую библиотеку cBigNumber. Надо вот так попробовать, может получится
C++
1
2
cBigNumber cbn;
fread( &cbn, sizeof( uint64_t )*2, 1, fp );// для 128-битного
Но к сожалению это не работает
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,571
Записей в блоге: 1
18.01.2015, 15:26 17
Цитата Сообщение от Ghostman23 Посмотреть сообщение
Так это вы развели всю эту муру с бесполезными сообщениями.
Муру развели вы бестолково оформленной темой.
Цитата Сообщение от Ghostman23 Посмотреть сообщение
А вот так можно получить ASCII код:
Код C++1
unsigned char c = 'я'; cout << (int)c;В самом первом сообщении у меня так и написано.
1. Такого кода в самом первом сообщении нет
2. Еще раз, для неграмотных и слабовидящих: 'я' не код ASCII.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
18.01.2015, 15:40 18
Предлагаю закончить обсуждение темы пока не будет внятных вопросов и конкретных примеров кода. Гадание на кофейной гуще мне не интересно.
1
Ghostman23
0 / 0 / 1
Регистрация: 20.01.2013
Сообщений: 44
18.01.2015, 16:20  [ТС] 19
Цитата Сообщение от zer0mail Посмотреть сообщение
1. Такого кода в самом первом сообщении нет
2. Еще раз, для неграмотных и слабовидящих: 'я' не код ASCII.
1. я имел в виду что у меня в первом сообщении написано:

Цитата Сообщение от Ghostman23 Посмотреть сообщение
unsigned char c = s[i];
num <<= 8;
num += c;

2. Код из расширенной таблицы ASCII для win1251

Да, я согласен насчёт закончить обсуждение темы. Буду копать в направлении библиотеки gmp
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
18.01.2015, 16:28 20
Цитата Сообщение от zer0mail Посмотреть сообщение
Еще раз, для неграмотных и слабовидящих: 'я' не код ASCII.
Есть Основная таблица ACSII с кодами от 0 до 127 и Расширенная таблица ACSII с кодами от 128 до 255.
И вообще, я чего-то недопонимаю. Лично мне проблема была понятна с самого первого поста. И ее можно было бы решить с помощью union, если бы не одно маленькое НО. В "некоторых" компьютерах числа представлены переставленными байтами. Так число 256 представляется байтами 0 1, а не 1 0, как записал бы это человек в 256-ричной с/с.
Так что, ИМХО, надо просто проверить, с каким компьютером ты имеешь дело (эта процедура называется, кажется, testindian, и если вот с таким, то просто переставлять пары соседних байт
1
18.01.2015, 16:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2015, 16:28

Как в выделенную память записать поочередно число int, массив char[n], и еще число int
Выделяю память void* Start=malloc(Size); Как туда записать поочередно...

Вывести на экран сумму кодов (по ASCII) цифр входящих в заданное число
help

С помощью оператора if вывести заданное число, а под ним ASCII код по 16 в строку
Задача: С помощью оператора if вывести заданное число, а под ним ASCII код по...


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

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

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