Malaja
|
|
« : 16-08-2005 12:17 » |
|
Господа, очередной тормоз в голове: есть CString (или char - неважно): char bufHexFull[] = "0x80000015"; есть unsigned long unsigned long nRes; Надо как-то сделать так, чтобы nRes = как-то(bufHexFull); чтобы nRes = 1073742301. Как из десятичного сделать 16-тиричное, ясно, а вот наоборот? Заранее спасибо!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
ChaoticCube
ChaoticCube
Помогающий
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
|
|
« Ответ #4 : 16-08-2005 13:22 » |
|
Mayk, Спасибочки - работает! ChaoticCube, с hex что-то не получилось - у меня cin не срабатывает, т.е. останова для ввода не происходит (я напрочь уже не помню, что там надо сделать, чтобы оно правильно работало )
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Pu
Большой босс
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
Большой босс
Offline
78
|
|
« Ответ #6 : 16-08-2005 14:33 » |
|
еще есть такое long strtol( const char *nptr, char **endptr, int base ); подробности в мсдн
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Malaja
|
|
« Ответ #7 : 17-08-2005 08:08 » |
|
Pu,
а вот с этими функциями все очень забавно - при одних числах они работают правильно, при других - нет, т.е очень похоже на переполнение. Посему опасно. Самое спокойное - способ, предложенный Maykом, с использованием sscanf ( видимо, т.к. это стандартная функция). Почему это происходит - не знаю. Т.е. с StrToIntEx() я еще могу понять, т.к. она работает только с int, а вот с strtol() совсем неясно, т.к. там работает уже long (видимо, если бы был unsigned long, все было бы нормально).
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #8 : 17-08-2005 09:15 » |
|
Malaja, тогда чем тебе не нравится strtoul и не знаю, на тему стандартности помоему ты погорячилась. Как бы функции описаны в хедере stdlib.h , куда уж стандартнее, в принципе мое дело предложить, у меня они работают просто отлично.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Malaja
|
|
« Ответ #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
Большой босс
Offline
78
|
|
« Ответ #10 : 17-08-2005 11:05 » |
|
Malaja, заостряю внимание на последнем посте я упомянул в нем функцию strtoul эта функция для unsigned long. а то что у тебя произошло дык это все правильно. 8 означает что в старшем разряде у тебя 1 те число отрицательное, Если это HRESULT соответствует ошибке.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
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
|
|
« Ответ #12 : 18-08-2005 07:42 » |
|
Pu, извини меня, пожалуйста, я разницы не увидела, уперлась в strtol!!! Прости затурканную проектом! Теперь таки все работает! Еще раз спасибочки всем!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|