![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте! Пожалуйста, помогите мне написать конвертер OCT-подобной системы счисления в шестнадцатеричную. Надо чтоб "A,B,C,D,E,F,G,O" конвертировались в шестнадцатеричную систему счисления. Нужно для моего проекта. Спасибо заранее.
|
|
#2
|
||||
|
||||
|
Цитата:
Вот та которая преобразует из любой системы счисления в число: Код:
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; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
mobac (05.04.2014)
| ||
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
||||
|
||||
|
Цитата:
Если просто убрать пробелы - то StringReplace. |
|
#5
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
s: String;
k: LongWord;
begin
s := StringReplace(Edit1.Text, ' ', '', [rfReplaceAll]);
if TryBaseXToUInt(s, 'ABCDEFGO', k)
then Edit2.Text := IntToHex(k, 8)
else Edit2.Text := 'Ошибка';
end;p.s. А почему "AAA AAA AAA CAA" после склейки преобразуется в "AAAAAAAAAEAA"? ![]() |
|
#6
|
|||
|
|||
|
Нет, вы не так поняли, мне надо, чтоб можно было преобразовать в шестнадцатеричный код не одно число, а несколько в одной строке (через пробелы). Например: ABA BBA CAB BAA превращались в edit2.text=08 48 81 40. Спасибо за понимание. Вот это у меня не получается
![]() |
|
#7
|
||||
|
||||
|
Ну это не сложно, можно конечно ручками распарсисть строку по пробелам, но есть проще вариант - использовать класс TStringList
Код:
Var
SL: TStringList;
i: Integer;
Result: LongWord;
begin
SL := TStringList.Create;
SL.Delimiter := #32;
SL.DelimitedText := 'AAA AAA AAA CAA';
for i := 0 to SL.Count - 1
do begin
TryBaseXToUInt(SL.Strings[i],8,Result);
ShowMessage(IntToStr(Result));
end;
end; |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
mobac (06.04.2014)
| ||
|
#8
|
||||
|
||||
|
В дополнение к ответу poli-smen,
Вообще-то по алфавиту ABCDEFGH. Это опечатка или так и задумано? Если опечатка - то хитрый поиск можно поменять на Код:
Value[i] - 'A'; Последний раз редактировалось Bargest, 05.04.2014 в 22:55. |
|
#9
|
|||
|
|||
|
Так задумано, это не опечатка
![]() |