![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Из чара(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