نمایش نتایج 1 تا 4 از 4

نام تاپیک: تبدیل سریع کارکتر اسکی به کارکتر اسکی دیگر

  1. #1
    کاربر دائمی آواتار mbshareat
    تاریخ عضویت
    آبان 1387
    محل زندگی
    شهر مقدس قم-چهارمردان-کوچه 37
    پست
    963

    تبدیل سریع کارکتر اسکی به کارکتر اسکی دیگر

    سلام
    من یک رشته کد اسکی دارم که میخوام بعضی کارکترها رو در اون با کارکترهای دیگه جایگزین کنم. مثلاA رو B کنم.
    ساده ترین روش استفاده از دو رشته و استفاده از Pos هست:
    Procedure ChangeChars(Var S:String);
    Var
    A,B:String;
    I,P:Integer;
    begin
    A:=#45#67#123;
    B:=#46#69#130;
    For I:=1 To Length(S) Do
    Begin
    P:=Pos(S[I],A);
    If P>0 then
    S[I]:=B[P];
    End;
    end;

    اما این روش کند هست. روش دیگه تعریف همه کارکترها و جایگزینی با استفاده از کد اسکی به عنوان اندیس آرایه هست:
    Procedure ChangeChars2(Var S:String);
    Var
    A,B:String;
    I:Integer;
    Ch:Array[0..255]of Chars;
    begin
    For I:=0 To 255 Do
    Ch[I]:=Chr(I);
    A:=#45#67#123;
    B:=#46#69#130;
    For I:=1 To Lenght(A) Do
    Ch[Ord(A[I])]:=B[I];
    For I:=1 To Lenght(S) Do
    S[I]:=Ch[Ord(S[I])];
    end;

    این روش هم به نظرم سریعترین روش نیست.اگر میشد از اشاره گر PChar یا PByteArray استفاده کرد بهتر بود. ولی روشش رو بلد نیستم.
    Procedure ChangeChars3(Var S:String);
    Var
    A,B:String;
    I:Integer;
    Ch256:String;
    P1,P2:PChar;
    begin
    For I:=0 To 255 Do
    Ch256:=Ch256+Chr(I);
    A:=#45#67#123;
    B:=#46#69#130;
    For I:=1 To Length(A) Do
    Ch256[Ord(A[I])]:=B[I];
    P1:=PChar(S);
    P2:=PChar(Ch256);
    For I:=1 To Length(S) Do
    P1[I]:=P2[P1[I]^];
    end;

    سعی کردم از PByteArray برای P2 استفاده کنم باز هم نشد!
    Procedure ChangeChars4(Var S:String);
    Var
    A,B:String;
    I:Integer;
    Ch256:String;
    P1:PChar;
    P2:PByteArray;
    begin
    For I:=0 To 255 Do
    Ch256:=Ch256+Chr(I);
    A:=#45#67#123;
    B:=#46#69#130;
    For I:=1 To Length(A) Do
    Ch256[Ord(A[I])]:=B[I];
    P1:=PChar(S);
    P2:=@Ch256;
    For I:=1 To Length(S) Do
    P1[I]:=P2[P1[I]];
    end;

    فقط میخوام Ord استفاده نکنم
    آخرین ویرایش به وسیله mbshareat : جمعه 08 دی 1402 در 21:50 عصر

  2. #2
    کاربر دائمی آواتار mbshareat
    تاریخ عضویت
    آبان 1387
    محل زندگی
    شهر مقدس قم-چهارمردان-کوچه 37
    پست
    963

    نقل قول: تبدیل سریع کارکتر اسکی به کارکتر اسکی دیگر

    نمی دونم آیا ()Ord کند بود یا نه ولی آخرش بیخیال اشاره گر شدم و به این شکل کار کرد:(Ch256 رو از یک شروع به مقدار دهی کردم که خرابکاری نشه)
    Procedure ChangeChars(Var S:String);
    Var
    A,B:String;
    I:Integer;
    Ch256:String;
    P1,P2:PChar;
    begin
    For I:=1 To 255 Do
    Ch256:=Ch256+Chr(I);
    A:=#65#97;//Aa
    B:=#66#99;//Bc
    For I:=1 To Length(A) Do
    Ch256[Ord(A[I])]:=B[I];
    P1:=PChar(S);
    For I:=1 To Length(S) Do
    S[I]:=Ch256[Byte(P1[I-1])];
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    Var
    S:String;
    begin
    S:='Aa';
    ChangeChars3(S);
    ShowMessage(S);
    end;


    این 4 خط یک نتیجه رو میدند. فقط نمی دونم هنگام استفاده از Byte و اشاره گر PChar طول رشته تا چقدر میتونه باشه. چون ممکن هست رشته طولانی تر از 64 کیلو بایت هم داشته باشم و نمی دونم آیا همیشه یکسان هستند یا نه:
     
    S[I]:=Ch256[Ord(S[I])];
    S[I]:=Ch256[Byte(S[I])];
    S[I]:=Ch256[Ord(P1[I-1])];
    S[I]:=Ch256[Byte(P1[I-1])];

  3. #3

    نقل قول: تبدیل سریع کارکتر اسکی به کارکتر اسکی دیگر

    سلام. اگر رشته خیلی طولانیه از استریم استفاده کن. اگر انسی هست TIdBytes هم گزینه مناسبیه. راه زیاد داره
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

  4. #4
    کاربر دائمی آواتار mbshareat
    تاریخ عضویت
    آبان 1387
    محل زندگی
    شهر مقدس قم-چهارمردان-کوچه 37
    پست
    963

    نقل قول: تبدیل سریع کارکتر اسکی به کارکتر اسکی دیگر

    ممنونم. تعدادی سوال ساده برام پیش اومد.
    استفاده تابع Byte رو درست نفهمیدم.ظاهرا در رشته هم ارز Ord هست اما Ord در متغیرهای تعریف کاربر هم کاربرد داره.اسم این نوع متغیر چیه؟:
    Type A=(Red,Blue,Green);

    چرا اگر رشته S داشته باشیم، PChar(S) با S@ برابر نیست؟( Byte(S[1]) نتیجه متفاوت میده!)
    تابع Byte کم ارزشترین بایت نوع عدد صحیح رو برمی گردونه؟

تاپیک های مشابه

  1. کمک سریع لطفا
    نوشته شده توسط rzrajaie در بخش Android Studio
    پاسخ: 2
    آخرین پست: شنبه 30 شهریور 1392, 11:48 صبح
  2. تقطیع گفتار
    نوشته شده توسط inspirationB در بخش برنامه نویسی Matlab
    پاسخ: 0
    آخرین پست: یک شنبه 30 تیر 1392, 09:02 صبح
  3. سوال: فایروال اشامپو (سریع سریع)
    نوشته شده توسط bozhmehrani در بخش تالار های مرتبط با شبکه و امنیت
    پاسخ: 0
    آخرین پست: یک شنبه 05 تیر 1390, 22:47 عصر
  4. گفتگو: خواندن سریع فایل های باینری
    نوشته شده توسط Nova19 در بخش C#‎‎
    پاسخ: 0
    آخرین پست: چهارشنبه 07 اسفند 1387, 22:04 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •