Есть ли где-нибудь готовые ? Лучше на С. Нужен обычный вещественный формат double precision (qword 64 бит = 8 байт), различные целые итп.
Перевод 16-ой числа из строки в число 10-ное: Код (Text): function StrHexToInt(s: string): Integer; var i, n, b: Integer; function Exponentation(num, level: Integer): Integer; begin case level of 0: Result := 1; 1: Result := num; else Result := num*Exponentation(num, level - 1); end; end; function GetNumByChar(c: char): Integer; begin case c of '0': Result := 0; '1': Result := 1; '2': Result := 2; '3': Result := 3; '4': Result := 4; '5': Result := 5; '6': Result := 6; '7': Result := 7; '8': Result := 8; '9': Result := 9; 'A': Result := 10; 'B': Result := 11; 'C': Result := 12; 'D': Result := 13; 'E': Result := 14; 'F': Result := 15; else Result := -1; end; end; begin s := UpperCase(s); n := length(s); if n > 8 then begin Result := -1; Exit; end; Result := 0; for i := n downto 1 do begin b := GetNumByChar(s[i]); if b = -1 then begin Result := -1; Exit; end; Result := Result + Exponentation(16, n - i)*b; end; end;
в С есть функции аtoi() и atof() (находятся в stdlib.h) для целых : Код (Text): int atoi( const char *string ); для вещественных : Код (Text): double atof( const char *string );
razor atoi/atof/atol не работают со строками содержащими символы A,B,C,D,E,F. Только цифры (десятичные строки)
Если нужно перевести шестнадцатеричную строку вида '1F3D5B79' в целое число, то можно так: Код (Text): char h_tbl[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,\ 0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\ 0,10,11,12,13,14,15}; //=============================================================== int HexToInt(char* lpString) { int result=0; int i=0; char ch; while ( (ch = lpString[i++]-0x30) >= 0 ) result = (result<<4) + h_tbl[ch]; return result; } //=============================================================== int val = HexToInt("1f3d5b79");
пачка функций strto* где вместо '*' может быть 'ul', 'l', 'll', 'ull', 'q', 'uq', 'imax', 'umax', 'd', 'f'. Для целых -- в любой системе счисления читать можно, а флоаты ('d' и 'f'), только в десятичной и шестнадцатеричной, да и то, система определяется форматом записи числа, а не программером
cresta. Для ch >= 0x66 этот код будет вылезать за пределы таблицы h_tbl, возможен Access Violation. Желательно либо заполнить конец таблицы нулями, либо переписать условие цикла: Код (Text): while ( unsigned(ch = lpString[i++]-0x30) < unsigned(0x36) ) result = (result<<4) + h_tbl[ch]; Здесь проверяется, что 0x30 <= ch < 0x66, так как при ch < 0x30 вычитание даст отрицательное число. При беззнаковом сравнении это отрицательное число больше, чем 0x8000 0000, значит, заведомо больше 0x36. А вообще идея с таблицей очень хорошая. Спасибо, cresta.
SnugForce Код (Text): function GetNumByChar(c: char): Integer; begin case c of '0': Result := 0; '1': Result := 1; '2': Result := 2; '3': Result := 3; '4': Result := 4; '5': Result := 5; '6': Result := 6; '7': Result := 7; '8': Result := 8; '9': Result := 9; 'A': Result := 10; 'B': Result := 11; 'C': Result := 12; 'D': Result := 13; 'E': Result := 14; 'F': Result := 15; else Result := -1; end; end; это что ? анекдот про индийского программиста?
SDragon Вообще-то подразумевалась передача валидной zero-terminated строки P.S. Приведенное тобой условие неверное. По нему например "1f3d5b79" возвращает 1 вместо 524114809. Надо просто расширить таблицу до 256 байт, установив для невалидных символов -1.
Сорри, ошибочка вышла: Код (Text): while(unsigned(ch = lpString[i++]-0x30) <[b]=[/b] unsigned(0x36)) result = (result<<4) + h_tbl[ch];