Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Из чара(ord), в нормальный вид. [D7, XP]


The Sound ©   (2006-01-31 20:46:00) 

Уважаемые мастера. Такой вопрос, имееться строчка, типа:
"84 104 105 115 32 115 111 102 116 119 97 114 101 32 105 115"
Где каждое из числа, являеться символом, в Чаре(ord).
В сущности код, преобразовавший символы в чиста приблезительно выглядит так:

textC := StrLen(PChar(textF));
For i :=1 to textC do
 begin
  textR := chr(ord(textF[i]));
  textI := ord(textR);
  textN := textN+' '+IntToStr(textI)
 end;

Так, вот, подскажите, как преобразовать код, что бы он (подлец) обратно кодировал?
Заранее, большое спасибо за ответы ;)


Gydvin   (2006-01-31 22:38:00) [1]

М-м, по-моему этот тот же самый код? Быстрее он не стал, кажется :)


Ошибка была, then вместо do

можно и так

function perekod (s:string):string;
var
x,i:integer;
s1:string;
begin
 if s='' then exit;
while s[length(s)]=' ' do delete(s,length(s),1);
if s='' then exit;

while s[1]=' ' do delete(s,1,1);
if s='' then exit;
s:=s+' ';
for x:=1 to length(s) do
 if s[x]<>' ' then s1:=s1+s[x] else
begin
  try
     i:=strtoint(s1);
  except
     showmessage('Error');
      exit;
  end;
  s1:='';
  if (i <= 255) and (i > 0) then else exit;
result:=result+chr(i);
end;
end;


Zeqfreed   (2006-01-31 22:22:00) [2]

Gydvin ©   (31.01.06 22:20) [13]

> Кстати автор нехотел читать по одному символу :(

По-другому нельзя. Только если какой-нибудь хитрый предсказывающий ИИ писать.

> зы. а зачем #9

Spaces = [' '];выглядит некрасиво ;)


Zeqfreed   (2006-01-31 22:20:00) [3]

Gydvin ©   (31.01.06 22:10) [11]
Да, разумеется, надо знак «больше» вместо «равно».

Gydvin ©   (31.01.06 22:03) [10]
М-м, по-моему этот тот же самый код? Быстрее он не стал, кажется :)

P.S. http://en.wikipedia.org/wiki/Corry? :)


Gydvin   (2006-01-31 22:20:00) [4]

Zeqfreed ©   (31.01.06 21:58) [9]
Кстати автор нехотел читать по одному символу :(
( The Sound ©   (31.01.06 21:15) [5])

хотя у тебя гораздо лучше, с проверками

зы. а зачем #9


Gydvin   (2006-01-31 22:10:00) [5]

Zeqfreed ©   (31.01.06 21:58) [9]
Последняя цифра неучитывается


Gydvin   (2006-01-31 22:03:00) [6]

Corry, засыпаю

function perekod (s:string):string;
var
s1:string;
begin

if s='' then exit;
while s[length(s)]=' ' do delete(s,length(s),1);
if s='' then exit;

while s[1]=' ' do delete(s,1,1);
if s='' then exit;
s:=s+' ';
result:='';
while pos(' ',s)>0 do begin
   s1:=copy(s,1,pos(' ',s)-1);
   result:=result+chr(strtoint(s1));
  delete(s,1,pos(' ',s));
end;
end;


Zeqfreed   (2006-01-31 21:58:00) [7]

Gydvin ©   (31.01.06 21:39) [7]
Очень тормознутая ф-ция. Рискну предложить свой вариант :)

function ByteStrToCharStr(const Source : String) : String;
const
 Spaces = [' ', #9];
var
 i, int : Integer;
 token : String;
begin
 Result := '';

 token := '';
 i := 1;
 repeat
  if (Source[i] in ['0'..'9']) then
   token := token + Source[i]
  else if (Source[i] in Spaces) then begin
   if (token <> '') then begin
    int := StrToInt(token);
    if (int <= High(Byte)) and (int > 0) then
     Result := Result + Chr(int)
    else
     raise Exception.Create(Format('Argument before pos %d exceeds 8-bit boundary', [i]));

    token := '';
   end;
  end else
   raise Exception.Create(Format('Invalid char at pos: %d', [i]));

  Inc(i);
 until (i = length(Source));
end;


The Sound   (2006-01-31 21:54:00) [8]

Zeqfreed ©   (31.01.06 21:37) [6]
Gydvin ©   (31.01.06 21:39) [7]

Утром буду разбираться.
Спасибо что неполенились написать код %)


Gydvin   (2006-01-31 21:39:00) [9]

function perekod (s:string):string;
var
s1:string;
begin

 if s='' then exit;
while s[length(s)]=' ' then delete(s,length(s),1);
 if s='' then exit;

while s[1]=' ' then delete(s,1,1);
 if s='' then exit;
 s:=s+' ';
 result:='';
while pos(' ',s)>0 do begin
    s1:=copy(s,1,pos(' ',s)-1);
    result:=result+chr(strtoint(s1));
   delete(s,1,pos(' ',s));
end;
end;


Zeqfreed   (2006-01-31 21:37:00) [10]

The Sound ©   (31.01.06 21:15) [5]

TDynByteArray = array of Byte;

. . .

function StrToByteArr(const Source : String; var a : TDynByteArray) : Integer;
var
 Str : TStrings;
 i : Integer;
begin
 Result := -1;

 Str := TStringList.Create();
 try
  Str.Delimiter := ' ';
  Str.DelimitedText := Source;

  if Str.Count <= 0 then Exit;
  SetLength(a, Str.Count);
  for i := 0 to Str.Count - 1 do begin
   try
    a[i] := Byte(StrToInt(Str[i]));
   except end;
  end;

  Result := Str.Count;
 finally
  Str.Free;
 end;
end;


The Sound   (2006-01-31 21:15:00) [11]

Zeqfreed ©   (31.01.06 21:11) [4]
Несовсем, дело в том, что в начале мы имеем строчку типа "84 104 105 115"
то есть считывать по 1-му символу не есть гуд. рейдёться считывать стр-ом, до пробела, переводить в символ, и тд.

Задача намного труднее чем первоначальная. Я не знаю как её реализовать =(


Zeqfreed   (2006-01-31 21:11:00) [12]

The Sound ©   (31.01.06 20:46)
Если я правильно понял, то IntToStr(Ord(YourChar)).


The Sound   (2006-01-31 21:10:00) [13]

Desdechado ©   (31.01.06 21:09) [2]
Я не понимаю как обратно =(


Desdechado   (2006-01-31 21:09:00) [14]

что во что?
у тебя есть взаимнообратные функции chr и ord, что еще надо?


The Sound   (2006-01-31 20:55:00) [15]

Ах, да, если это упростит дело, то:

 textN, textF: string;
 i, textC, textI: integer;
 textR: char


Наверх

Титульная страница Поиск, карта сайта Написать письмо