Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2016, 19:13   #1
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию отображение массива char в uint32 (используя смещение)

Добрый вечер!
Сегодня была необходимость отобразить массив символов char (8 цифр) в переменной uint32.

Код:
Например:
char snum[8] = {'0', '8', '0', '0', '3', '6', '1', '1'};
uint32_t sp = 0x08003611;
Пробовал сделать вот так:
Код:
uint8_t n = 0;
uint32_t sp = 0;
uint8_t snum[8] = {'0', '8', '0', '0', '3', '6', '1', '1'}

for(n = 0; n < 8; n++) {
  c = snum[n];
  if (c < '0' || c > '9')
    break;
  sp += (uint8_t)(c - '0') << 4*n;
}
Но результат получился наоборот:
Код:
uint32_t sp = 0x11630080;
Но как бы оно и понятно, но попробовав изменить порядок чтения массива char, ожидаемого результата не получил. В конце получил то ли '0', то ли также наоборот.
Код:
uint8_t n = 0, i = 0;
uint32_t sp = 0;
uint8_t snum[8] = {'0', '8', '0', '0', '3', '6', '1', '1'}

for(n = 7; n > 0; n--) {
  c = snum[n];
  if (c < '0' || c > '9')
    break;
  sp += (uint8_t)(c - '0') << ((i++)-1)*n;
}
Решил задачу по другому.
Но все же хочу понять, что я сделал не так и в чем я не прав?

Последний раз редактировалось Андрю)(@; 29.09.2016 в 21:19. Причина: При создании темы неправильно указал данные массива
Андрю)(@ вне форума Ответить с цитированием
Старый 29.09.2016, 19:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас же в массиве не '0', а 0, это разное.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.09.2016, 19:50   #3
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас же в массиве не '0', а 0, это разное.
Я ошибся, когда код набирал при создании темы.
Код:
uint8_t snum[8] = {'0', '8', '0', '0', '3', '6', '1', '1'}
Андрю)(@ вне форума Ответить с цитированием
Старый 29.09.2016, 20:46   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

почитайте про big endian и little endian
порядок байт нужно было тогда уж так менять:
Код:
sp += (uint8_t)(c - '0') << ((7 - n) <<2);
pu4koff вне форума Ответить с цитированием
Старый 29.09.2016, 21:22   #5
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
почитайте про big endian и little endian
порядок байт нужно было тогда уж так менять:
Код:
sp += (uint8_t)(c - '0') << ((7 - n) <<2);
Спасибо, сейчас прочту и попробую разобрать на листочке.
Расписал сейчас на листочке со всеми сдвигами первый вариант кода когда на выходе получал uint32 наоборот, в первом сообщение у себя поправил эту строчку, чтобы не путаться двойным сдвигом, на:
Код:
sp += (uint8_t)(c - '0') << 4*n);
Андрю)(@ вне форума Ответить с цитированием
Старый 02.10.2016, 10:31   #6
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
почитайте про big endian и little endian
порядок байт нужно было тогда уж так менять:
Код:
sp += (uint8_t)(c - '0') << ((7 - n) <<2);
Спасибо, почитал.
Попробовал все это сделать на листочке. Вроде разобрался, со сдвигами, теперь буду пользоваться этой операцией чаще.
Андрю)(@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива char (C) andreyfom Помощь студентам 2 12.10.2015 18:59
Приведение массива char[] (или char* ) в LPCTSTR polin11 Общие вопросы C/C++ 3 29.07.2015 17:01
Преобразование массива char Rsys Помощь студентам 1 19.05.2013 14:58
как записать адрес массива + смещение VintProg Общие вопросы C/C++ 3 10.08.2011 11:18
Смещение элементов массива при изменении его длины. Alex Cones Общие вопросы Delphi 2 23.10.2009 15:19