Hex string to value
От: Аноним  
Дата: 28.10.10 13:38
Оценка:
Понадобилась банальнейшая вещь — преобразовать значение из строки...
Имею строку в которой хранится шестнадцатеричное представление HRESULT.
Ну и нужно получить само значение HRESULT.
Естественно, воспользовался RTL'ной ф-цией. А так как HRESULT есть long'ом, то в качестве ф-ции и выбрал strtol.
Была написана следующая обёрточка:
HRESULT toHResult(const TCHAR *sz) {
   return _tcstol(sz, NULL, 16);
}

Я был удивлён, когда она начала возвращать бред.

После проверки, выяснил, что нужно пользоваться ф-цией strtoul:
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <conio.h> 
#include <limits.h>
#include <winerror.h>

//typedef long HRESULT;

HRESULT toHResult(const TCHAR *sz) {
   //long lVal = _tcstol(sz, NULL, 16);
   //return lVal;
   unsigned long ulVal = _tcstoul(sz, NULL, 16);
   return ulVal;
}

int _tmain(int argc, _TCHAR* argv[])
{
   TCHAR *sz = _T("0x80070057"); // E_INVALIDARG
   HRESULT hRes = toHResult(sz);

   bool check = (E_INVALIDARG == hRes);

   char sz2[100];
   std::cout << (check ? "success:\r\n" : "fail:\r\n") << hRes << "\r\n" << ltoa(hRes, sz2, 16);

   return _getch();
}


Вопрос знатокам. Почему для получения signed long значения нужно пользоваться ф-цией возвращающей unsigned long?



В первом случае, когда пользуюсь strtol в консоль выводится

fail:
2147483647
7fffffff


А когда strtoul:

success:
-2147024809
80070057

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.