Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: перевод 16-тиричного числа, лежащего в CString, в unsigned long  (Прочитано 12021 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

us
Offline Offline
Пол: Женский

« : 16-08-2005 12:17 » 

Господа, очередной тормоз в голове:   Ха-ха-ха

есть CString (или char - неважно): char bufHexFull[] = "0x80000015";
есть unsigned long unsigned long nRes;

Надо как-то сделать так, чтобы nRes = как-то(bufHexFull); чтобы nRes = 1073742301.
Как из десятичного сделать 16-тиричное, ясно, а вот наоборот?

Заранее спасибо!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #1 : 16-08-2005 12:39 » 

Нашел в MSDN функцию hex.

Пример такой
int i = 100;
cout << hex << i;
Выдает: 64.

Потестируй ее на забирание значения из потока. Может поможет.
Записан

Сила ночи, сила дня - одинакого фигня....
Mayk
Гость
« Ответ #2 : 16-08-2005 13:03 » 

Код:
char *s = "0x80000015";
unsigned long l;
sscanf(s,"%x",&l);
printf("%x/%u\n",l,l);
Что-то типа того
Записан
Mayk
Гость
« Ответ #3 : 16-08-2005 13:13 » 

Ну или вот еще для любителей математики:
Код:
l=0;
s=s+2; //skip 0x header
long r=1;
if(s[0])
for(int i=1;s[i];++i)
r*=16;


while(*s){
l=l+ r*(*s-'0');
++s;
r=r/16;

}
printf("%x/%u\n",l,l);
Реализован стандартный алгоритм преобразования из 16ой в 10ую сс: Первую с конца цифру домнажаем на 16**0, вторую с конца на 16**1, тд
« Последнее редактирование: 20-12-2007 21:14 от Алексей1153++ » Записан
Malaja
Команда клуба

us
Offline Offline
Пол: Женский

« Ответ #4 : 16-08-2005 13:22 » 

Mayk,

Спасибочки - работает!  Целую

ChaoticCube,

с hex что-то не получилось - у меня cin не срабатывает, т.е. останова для ввода не происходит   Здесь была моя ладья... (я напрочь уже не помню, что там надо сделать, чтобы оно правильно работало Жаль )
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Pu
Большой босс

ru
Offline Offline
78


« Ответ #5 : 16-08-2005 14:25 » 

BOOL StrToIntEx( LPCTSTR pszString, DWORD dwFlags,int *piRet);

dwFlags
[in] One of the following values specifying how pszString should be parsed for its conversion to an integer.
STIF_DEFAULT
The string at pszString contains the representation of a decimal value.
STIF_SUPPORT_HEX
The string at pszString contains the representation of either a decimal or hexadecimal value. Note that in hexadecimal representations, the characters A-F are case-insensitive.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Pu
Большой босс

ru
Offline Offline
78


« Ответ #6 : 16-08-2005 14:33 » 

еще есть такое
long strtol( const char *nptr, char **endptr, int base );
подробности в мсдн
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Malaja
Команда клуба

us
Offline Offline
Пол: Женский

« Ответ #7 : 17-08-2005 08:08 » 

Pu,

а вот с этими функциями все очень забавно - при одних числах они работают правильно, при других - нет, т.е очень похоже на переполнение. Посему опасно.
Самое спокойное - способ, предложенный Maykом, с использованием sscanf ( видимо, т.к. это стандартная функция).
Почему это происходит - не знаю. Т.е. с StrToIntEx() я еще могу понять, т.к. она работает только с int, а вот с strtol() совсем неясно, т.к. там работает уже long (видимо, если бы был unsigned long, все было бы нормально).
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Pu
Большой босс

ru
Offline Offline
78


« Ответ #8 : 17-08-2005 09:15 » 

Malaja, тогда чем тебе не нравится strtoul Ага
и не знаю, на тему стандартности помоему ты погорячилась. Как бы функции описаны в хедере stdlib.h , куда уж стандартнее, в принципе мое дело предложить, у меня они работают просто отлично.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Malaja
Команда клуба

us
Offline Offline
Пол: Женский

« Ответ #9 : 17-08-2005 10:31 » 

Pu,

У меня в проекте были реальные цифры :400001DD и 0x80000015. С первым числом все ОК, со вторым - калькулятор и сканф считают 2147483669, а strtol - 2147483647. Как???

Код:
                long nRes = 0;
char* strEnd;
                char bufHexFull[] = "0x80000015";
nRes = strtol(bufHexFull, &strEnd, 16);
У меня обычный WinXP, Vs6.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Pu
Большой босс

ru
Offline Offline
78


« Ответ #10 : 17-08-2005 11:05 » 

Malaja, заостряю внимание на последнем посте я упомянул в нем функцию  strtoul эта функция для unsigned long. а то что у тебя произошло дык это все правильно. 8 означает что в старшем разряде у тебя 1 те число отрицательное, Если это HRESULT соответствует ошибке.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Pu
Большой босс

ru
Offline Offline
78


« Ответ #11 : 17-08-2005 11:26 » 

цитируем мсдн
strtol returns the value represented in the string nptr, except when the representation would cause an overflow, in which case it returns LONG_MAX or LONG_MIN. strtol returns 0 if no conversion can be performed. wcstol returns values analogously to strtol. For both functions, errno is set to ERANGE if overflow or underflow occurs.

то есть вольно понимаем, что если происходит переполнение strtol возвращает LONG_MAX, что является такой штукой как 0x7FFFFFFF или  2147483647. все логично Ага
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Malaja
Команда клуба

us
Offline Offline
Пол: Женский

« Ответ #12 : 18-08-2005 07:42 » 

Pu,

извини меня, пожалуйста, я разницы не увидела, уперлась в strtol!!!  Жаль Прости затурканную проектом!   Вот такой я вот
Теперь таки все работает!  Целую
Еще раз спасибочки всем!  Улыбаюсь
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines