Преобразование строки в число
14.04.2013, 22:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от stmfaq
|
|
Даже не знаю правильно я сформулировал название темы
|
Название темы - так себе, терпимо. Но постановка задачи никуда не годится.
С трудом угадывается, что по УАРТу приходит последовательность цифр, которую надо преобразовать в число.
Сообщение от stmfaq
|
|
данные в таком формате 02,32,00 , и так далее, мне эти три байта нужно преобразовать в переменную со значением 23200
|
Вот первая загадка, порожденная неточными формулировками. Указанное значение этих трех байтов - десятичное, или шестнадцатиричное? А результат преобразовния "23200" - это десятичное, или шестнадцатиричное? Ведь от этого алгоритм преобразования существенно зависит.
Сообщение от stmfaq
|
|
они как раз и шли в ANSII кодировке ,было 30, 34, 33, 38, 30, 30, стало 04,38,00
|
А эта крупица исходной информации слегка проясняет картину. Оказывается, те "три байта", о которых говорилось вначале, вовсе и не байты. Их правильнее назвать двумя полубайтами, содержащими десятичные цифры. В таком случае, чтобы преобразовать эту последовательность в десятичное число, необходимо каждую цифру умножить на ее вес (на 1, 10, 100, 1000, и т.д.), и сложить все полученные произведения. Полученная сумма и будет той желаемой переменной. Только вот проблемка - ее числовое значение будет равно, например, 23200. А вот ее вид в шестнадцатиричной системе - совершенно не такой.
В общем, определитесь с тем, что на самом деле Вам надо, и сформулируйте задачу максимально точно.
|
|
|
|
14.04.2013, 23:04
|
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Преобразование строки в число
Для того чтобы было более понятно опишу процесс приема и передачи , для лучшей ясности допустим что все передается в DEC формате.
И так, устройство передает данные в формате ANSII , то есть, число 10 оно передаст как 49 (значение 1 в ANSII формате) и 48 (значение 0 в ANSII) . Допустим пришел пакет данных в таком формате, происходит его трансформация обратно в число 10, но в заголовке пакета есть данные которые имеют размер не один байт а два, получается что число, допустим unsigned int key=42300 девайс который передает трансформировал в 04 23 00 а затем перевел каждое значение в ANSII формат то есть данные полетели в таком формате 48 54 50 51 48 48 в результате я принимаю этот пакет и трансформирую все обратно сперва преобразовываю данные в 04 23 00 а за тем это мне нужно присвоить опять переменной unsigned int key= , и вот на этом этапе у меня возникла проблема , как это преобразовать.
Последний раз редактировалось stmfaq; 14.04.2013 в 23:08.
|
|
|
|
14.04.2013, 23:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
|
Re: Преобразование строки в число
key=04*10000+23*100+00
|
|
|
|
14.04.2013, 23:17
|
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от Ara41
|
|
key=04*10000+23*100+00
|
Интересно много это действие займет времени у STM8 ? Получится это делать на лету при скорости UART 115200 ?
|
|
|
|
14.04.2013, 23:18
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от stmfaq
|
|
число допустим unsigned int key=42300 девайс который передает трансформировал в 04 23 00 а затем перевел каждое значение в формат то есть данные полетели в таком формате 48 54 50 51 48 48
|
Здесь кроется ошибка, из-за неправильного понимания процесса. Никакой девайс не станет преобразовывать сначала в 04 23 00, чтобы тут же снова разделять эти байты на полубайты, и преобразовывать их в . На самом деле каждая отдельная цифра сразу (и очень легко) преобразуется в . Для этого к этой цифре достаточно прибавить шестнадцатиричное число 30h.
Сообщение от stmfaq
|
|
сперва преобразовываю данные в 04 23 00 а за тем это мне нужно присвоить опять переменной B]unsigned int[/B] key= и вот на этом этапе у меня возникла проблема , как это преобразовать.
|
Первая ошибка породила и вторую - снова лишнее преобразование, которое только усложняет процесс. А ведь достаточно каждую принятую цифру преобразовать из ANSII в ее числовое значение. То есть, для этого достаточно вычесть число 30h. А затем полученную цифру умножить на ее вес - на 1, 10, 100, 1000, и т.д., в зависимости от ее позиции в десятичном числе. И каждое полученное произведение прибавлять к будущей желаемой переменной (конечно же, перед началом этого суммирования переменную надо обнулить). И все, когда это проделаем с последней цифрой пакета, получим искомую переменную.
|
|
|
|
14.04.2013, 23:24
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от Ara41
|
|
key=04*10000+23*100+00
|
Неправильно. Каждый байт - это две цифры десятичного числа. Поэтому надо сначала выделить полубайты из байтов, и каждый полубайт умножить отдельно на свой коэффициент. То есть:
key = 0*100000 + 4*10000 + 2*1000+ 3*100 + 0*10 + 0
Ведь 04 и 23 - это шестнадцатеричные числа, и если умножить 23h на 100, то получится совсем не 2*1000+3*100
|
|
|
|
Сказали "Спасибо" Alex9797
|
|
|
14.04.2013, 23:27
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Преобразование строки в число
Alex9797, 30h - это в ASCII, а в ANSII (судя по информации ТС, я с ANSII дела не имел) кодировка другая. Если устройство, с которого идет информация, уже готовое и работает так, как описано, то нужно принимать как есть.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
14.04.2013, 23:29
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от Alex9797
|
Неправильно. Каждый байт - это две цифры десятичного числа. Поэтому надо сначала выделить полубайты из байтов, и каждый полубайт умножить отдельно на свой коэффициент. То есть:
key = 0*100000 + 4*10000 + 2*1000+ 3*100 + 0*10 + 0
Ведь 04 и 23 - это шестнадцатеричные числа, и если умножить 23h на 100, то получится совсем не 2*1000+3*100
|
Простите, чем 2*1000+3*100 отличается от 23*100? Зачем что-либо делить?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
14.04.2013, 23:29
|
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от Alex9797
|
|
Никакой девайс не станет преобразовывать сначала в 04 23 00,
|
Возможно, я не знаю что делает девайс , это черный ящик, у меня есть только описания формата в котором он передает данные.
Сообщение от Alex9797
|
|
То есть, для этого достаточно вычесть число 30h.
|
Я собственно так и делал
|
Код:
|
if (uart_buf[pr] ‹=57) uart_buf[pos]=uart_buf[pr]-48;else uart_buf[pos]=uart_buf[pr]-87; |
|
|
|
|
14.04.2013, 23:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
|
Re: Преобразование строки в число
Сообщение от Alex9797
|
|
Ведь 04 и 23 - это шестнадцатеричные числа, и если умножить 23h на 100, то получится совсем не 2*1000+3*100
|
почему шестнадцатеричные? судя по постам ТС, это передаются десятичные числа.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:29.
|
|