![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
В дополнение к ответу poli-smen,
Вообще-то по алфавиту ABCDEFGH. Это опечатка или так и задумано? Если опечатка - то хитрый поиск можно поменять на Код:
Value[i] - 'A'; Последний раз редактировалось Bargest, 05.04.2014 в 22:55. |
|
#4
|
|||
|
|||
|
Так задумано, это не опечатка
![]() |
|
#5
|
|||
|
|||
|
Цитата:
|
|
#6
|
||||
|
||||
|
Цитата:
Если просто убрать пробелы - то StringReplace. |
|
#7
|
||||
|
||||
|
Цитата:
Код:
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"? ![]() |
|
#8
|
|||
|
|||
|
Нет, вы не так поняли, мне надо, чтоб можно было преобразовать в шестнадцатеричный код не одно число, а несколько в одной строке (через пробелы). Например: ABA BBA CAB BAA превращались в edit2.text=08 48 81 40. Спасибо за понимание. Вот это у меня не получается
![]() |
|
#9
|
||||
|
||||
|
Ну это не сложно, можно конечно ручками распарсисть строку по пробелам, но есть проще вариант - использовать класс 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)
| ||
|
#10
|
|||
|
|||
|
Цитата:
:C Incompatible types 'String' and 'Integer' Последний раз редактировалось mobac, 06.04.2014 в 11:11. |
|
#11
|
||||
|
||||
|
Цитата:
Код:
TryBaseXToUInt(SL.Strings[i], 'ABCDEFGO', Result); |
|
#12
|
|||
|
|||
|
Цитата:
|
|
#13
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
i: Integer;
Result: LongWord;
begin
SL := TStringList.Create;
try
SL.Delimiter := #32;
SL.DelimitedText := Edit2.Text;
for i := 0 to SL.Count - 1 do
begin
TryBaseXToUInt(SL.Strings[i], 'ABCDEFGO', Result);
SL.Strings[i] := IntToHex(Result, 2);
end;
Edit2.Text := SL.DelimitedText;
finally
SL.Free;
end;
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
mobac (06.04.2014)
| ||
|
#14
|
|||
|
|||
|
А как сделать так, чтоб если у нас есть, допустим AAAAAAAAAEAA (склеенные , без пробелов), и чтоб они преобразовались в 00 00 00 100 (здесь я сам пробелы уберу)?
|
|
#15
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
s1, s2: String;
p: Integer;
k: LongWord;
begin
s1 := Edit2.Text;
p := 1;
while p <= Length(s1) do
begin
if TryBaseXToUInt(Copy(s1, p, 3), 'ABCDEFGO', k) then
begin
s2 := s2 + ' ' + IntToHex(k, 2);
end;
Inc(p, 3);
end;
Edit2.Text := Trim(s2);
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
mobac (06.04.2014)
| ||