Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.239.90.61] |
|
Сообщ.
#1
,
|
|
|
Хайль камрады!
А вот никто не подскажет как правильно пользоваться сими вещами: function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; procedure BinToHex(Buffer, Text: PChar; BufSize: Integer); ? Это мне нужно для самообразования. Вообще вот мой глобальный вопрос: Есть форма в шестых дельфях. На нее кладем одно поле ввода (TEdit) и три кнопки (TButton). Суть работы поля: В поле ввода нужно ввести десятичное число. Суть работы кнопок: 1 кнопка: Перевод содержимого поля ввода в двоичную систему счисления 2 кнопка: Перевод содержимого поля ввода в восмеричную систему счисления 3 кнопка: Перевод содержимого поля ввода в шестнадцатеричную систему счисления Еще должно проверятся введено ли в поле числовое значение или текстовое, но это я уже и сам смогу. Благо есть такие вещи как Str () и Val () =)) ---- Хотя вот заглянул в фак и нашел там перевод dec в hex Но почему стоит ограничение в восемь символов я не понял. Это, наверное, скомуниженно с SWAG'a =)) Там вопрос был навроде моего. function dec2hex(value: dword): string[8]; const hexdigit = '0123456789ABCDEF'; begin while value <> 0 do begin dec2hex := hexdigit[succ(value and $F)]; value := value shr 4; end; if dec2hex = '' then dec2hex := '0'; end; |
Сообщ.
#2
,
|
|
|
Блин, она ж вообще не рабочая
вот, поправил function dec2hex(value: dword): string; const hexdigit = '0123456789ABCDEF'; begin while value <> 0 do begin result := hexdigit[succ(value and $F)]+result; value := value shr 4; end; if result='' then result := '0'; end; Добавлено вот ее же на восьмеричную переколбасил: function dec2oct(value: dword): string; const octdigit = '012345678'; begin while value <> 0 do begin result := hexdigit[succ(value and 7)]+result; value := value shr 3; end; if result='' then result := '0'; end; Добавлено ну и тем же макаром под bin function dec2bin(value: dword): string; const bindigit = '01'; begin while value <> 0 do begin result := bindigit[succ(value and 1)]+result; value := value shr 1; end; if result='' then result := '0'; end; |
Сообщ.
#3
,
|
|
|
Ага. Та штука такая.. Паскальная. Причем тотальнопаскальная.
Вот, может кому че как понадобится function dec2bin(value: dword): string; const bindigit = '01'; begin while value <> 0 do begin result := bindigit[succ(value and 1)]+result; value := value shr 1; end; if result='' then result := '0'; end; А я тормоз! ТОРМОЗ! Дададада! |
Сообщ.
#4
,
|
|
|
Короче, вот вам универсальная процедура:
function Dec2X(const Value, Base: Cardinal): string; function GetChar(const N: Cardinal): Char; begin if N <= 10 then Result := Char(N + Ord('0')) else Result := Char(N - 10 + Ord('A')); end; var V, R: Cardinal; begin Result := ''; V := Value; repeat R := V mod Base; V := V div Base; Result := GetChar(R) + Result; until V < 2; if V <> 0 then Result := IntToStr(V) + Result; end; |
Сообщ.
#5
,
|
|
|
Немного подправил и добавил комменты.
{ Фунция представляет число Value в Base-ричной системе счисления, Base должно находиться в пределах [1..36] и представляется 10-ю цифрами [0..9] и 26-ю буквами английского алфавита ['A'..'Z'] } function Dec2X(const Value, Base: Cardinal): string; // Функция возвращает символ, соответствующий числу в N-ричной системе function GetChar(const N: Cardinal): Char; begin if N < 10 then // для систем счисления от 1 до 10 Result := Char(N + Ord('0')) else // для систем счисления выше 10, но не больше 36 ([0..9] + ['A'..'Z']) Result := Char(N - 10 + Ord('A')); end; var V, R: Cardinal; begin Result := ''; if Base <= 1 then begin // числа можно и в системе, состоящей из одного символа, представлять ;) if Base = 1 then begin // реализуем это SetLength(Result, Value); FillChar(Result[1], Value, Ord('0')); Exit; end else // а вот других систем счисления быть не может Abort; end else // ограничиваем представление систем счисления 10-ю цифрами и 26-ю буквами // английского алфавита if Base > 10 + (Ord('Z') + 1) - Ord('A') then Abort; // Выполняем преобразование в нужную систему виртуальным делением в столбик V := Value; repeat R := V mod Base; V := V div Base; Result := GetChar(R) + Result; until V < 2; // 2 - минимальная база, // то есть в любом случае когда-то "V div Base" будет равно 1 if V <> 0 then Result := IntToStr(V) + Result; end; |
Сообщ.
#6
,
|
|
|
монстр
|
Сообщ.
#7
,
|
|
|
Цитата мыш @ монстр Да нет, просто люблю фундаментальный подход |
Сообщ.
#8
,
|
|
|
s-mike, теперь можно и в ФАК это дело забацать
|
Сообщ.
#9
,
|
|
|
Цитата Тень @ теперь можно и в ФАК это дело забацать Как говорится, Done! |