Показать сообщение отдельно
  #2  
Старый 05.04.2014, 22:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 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;
Ответить с цитированием