Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизИз чара(ord), в нормальный вид. Найти похожие ветки
← →
The Sound © (2006-01-31 20:46) [0]Уважаемые мастера. Такой вопрос, имееться строчка, типа:
"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;
Так, вот, подскажите, как преобразовать код, что бы он (подлец) обратно кодировал?
Заранее, большое спасибо за ответы ;)
← →
The Sound © (2006-01-31 20:55) [1]Ах, да, если это упростит дело, то:
textN, textF: string;
i, textC, textI: integer;
textR: char
← →
Desdechado © (2006-01-31 21:09) [2]что во что?
у тебя есть взаимнообратные функции chr и ord, что еще надо?
← →
The Sound © (2006-01-31 21:10) [3]Desdechado © (31.01.06 21:09) [2]
Я не понимаю как обратно =(
← →
Zeqfreed © (2006-01-31 21:11) [4]The Sound © (31.01.06 20:46)
Если я правильно понял, тоIntToStr(Ord(YourChar))
.
← →
The Sound © (2006-01-31 21:15) [5]Zeqfreed © (31.01.06 21:11) [4]
Несовсем, дело в том, что в начале мы имеем строчку типа "84 104 105 115"
то есть считывать по 1-му символу не есть гуд. рейдёться считывать стр-ом, до пробела, переводить в символ, и тд.
Задача намного труднее чем первоначальная. Я не знаю как её реализовать =(
← →
Zeqfreed © (2006-01-31 21:37) [6]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;
← →
Gydvin © (2006-01-31 21:39) [7]
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;
← →
The Sound © (2006-01-31 21:54) [8]Zeqfreed © (31.01.06 21:37) [6]
Gydvin © (31.01.06 21:39) [7]
Утром буду разбираться.
Спасибо что неполенились написать код %)
← →
Zeqfreed © (2006-01-31 21:58) [9]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;
← →
Gydvin © (2006-01-31 22:03) [10]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;
← →
Gydvin © (2006-01-31 22:10) [11]Zeqfreed © (31.01.06 21:58) [9]
Последняя цифра неучитывается
← →
Zeqfreed © (2006-01-31 22:20) [12]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) [13]Zeqfreed © (31.01.06 21:58) [9]
Кстати автор нехотел читать по одному символу :(
(The Sound © (31.01.06 21:15) [5])
хотя у тебя гораздо лучше, с проверками
зы. а зачем #9
← →
Zeqfreed © (2006-01-31 22:22) [14]Gydvin © (31.01.06 22:20) [13]
> Кстати автор нехотел читать по одному символу :(
По-другому нельзя. Только если какой-нибудь хитрый предсказывающий ИИ писать.
> зы. а зачем #9Spaces = [" "];
выглядит некрасиво ;)
← →
Gydvin © (2006-01-31 22:38) [15]М-м, по-моему этот тот же самый код? Быстрее он не стал, кажется :)
Ошибка была, 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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c