|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Конвертирование oct - hex
Здравствуйте! Пожалуйста, помогите мне написать конвертер 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'; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 05.04.2014 в 22:55. |
#4
|
|||
|
|||
Так задумано, это не опечатка
|
#5
|
|||
|
|||
Цитата:
|
#6
|
||||
|
||||
Цитата:
Если просто убрать пробелы - то StringReplace. jmp $ ; Happy End! The Cake Is A Lie. |
#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)
|