
05.04.2014, 22:43
|
 |
Профессионал
|
|
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
|
|
Цитата:
Сообщение от mobac
Пожалуйста, помогите мне написать конвертер OCT-подобной системы счисления в шестнадцатеричную. Надо чтоб "A,B,C,D,E,F,G,O" конвертировались в шестнадцатеричную систему счисления.
|
Когда-то писал функции для преобразования из любой системы счисления в число и из числа в любую систему счисления. С тех пор много раз их использовал - так что ошибок в них быть не должно.
Вот та которая преобразует из любой системы счисления в число:
Код:
function TryBaseXToUInt(const Value, BaseStr: String; out UInt: LongWord): Boolean;
var
Base, i, p, k, OldUInt: LongWord;
begin
Result := False;
UInt := 0;
Base := Length(BaseStr);
if (Value <> '') and (Base > 1) then
begin
k := 1;
for i := 1 to Length(Value) do
if Value[i] = BaseStr[1] then Inc(k) else Break;
for i := k to Length(Value) do
begin
p := pos(Value[i], BaseStr);
if p = 0 then
begin
UInt := 0;
Exit;
end;
OldUInt := UInt;
UInt := UInt * Base + (p - 1);
if UInt < OldUInt then // Переполнение
begin
UInt := 0;
Exit;
end;
end;
Result := True;
end;
end;
Ну а преобразовать число в шестнадцатеричную систему счисления можно и с помощью стандартной IntToHex.
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
k: LongWord;
begin
if TryBaseXToUInt(Edit1.Text, 'ABCDEFGO', k) then
begin
ShowMessageFmt('%s => $%s', [Edit1.Text, IntToHex(k, 8)]);
end else
begin
ShowMessage('Ошибка');
end;
end;
|