تبدیل رشته به باینری (برنامه)

i_lover3000

Member
سلام :)

من امروز یه برنامه کوچیک پیدا کردم که رشته رو به باینری تبدیل میکنه :wink:
می خواستم ببینم کسی می تونه یکم توضیح در موردش کدش بهم بگه :neutral:


خیلی ممنون :sad:
موفق باشید.
 

پیوست ها

  • str2bin.rar
    1.7 کیلوبایت · بازدیدها: 27

the_king

مدیرکل انجمن
نویسنده این برنامه یا کدش رو واسه ویژوال بیسیک 5 نوشته بوده که تابع StrReverse رو نمی شناسه و یا
یادش رفته بوده که چنین تابعی هم هست. این تابع همون کاری رو انجام میده که StrRev انجام میده، یعنی رشته شما
رو برعکس می کنه، مثلا "ABC" رو به "CBA" تبدیل می کنه :

کد:
Public Function StrRev(ByVal Source As String) As String
    Dim Buffer As String
    While Source <> ""
        Buffer = Buffer & Right$(Source, 1)
        Source = Left$(Source, Len(Source) - 1)
    Wend
    StrRev = Buffer
End Function

اگه من این تابع رو می نوشتم :
کد:
Public Function StrRev(ByVal Source As String) As String
    Dim Index As Long
    For Index = Len(Source) To 1 Step -1
        StrRev = StrRev & Mid(Source, Index, 1)
    Next
End Function

تابع Str2Bin کاراکتر به کاراکتر یک رشته را به معادل Binary هشت بیتی (یک بایت) تبدیل می کند و به هم می چسباند.
در واقع این تابع اصلی برنامه است :
کد:
Public Function Str2Bin(ByVal Source As String) As String
    Dim Buffer As String, TempBuffer As String, CheckValue As String
    For i = 1 To Len(Source)
        CheckValue = Asc(Mid(Source, i, 1))
        While CheckValue <> 0
            TempBuffer = TempBuffer & (CheckValue Mod 2)
            CheckValue = CheckValue \ 2
        Wend
        While Len(TempBuffer) < 8
            TempBuffer = TempBuffer & "0"
        Wend
        Buffer = Buffer & StrRev(TempBuffer)
        TempBuffer = ""
    Next i
    Str2Bin = Buffer
End Function

اگه من این تابع را می نوشتم :
کد:
Public Function Str2Bin(ByVal Source As String) As String
    Dim Index As Long, Code As Long, Bit As Long
    For Index = 1 To Len(Source)
        Code = Asc(Mid(Source, Index, 1))
        For Bit = 7 To 0 Step -1
            Str2Bin = Str2Bin & IIf((Code And (2 ^ Bit)) = 0, "0", "1")
        Next
    Next
End Function

دو مورد در کد فرم اصلی وجود دارد :
کد:
    If Text1.Text = "" Then Exit Sub
    Text1.Text = Replace(Text1.Text, vbCrLf, " ")
    
    Text2.Text = Str2Bin(Text1.Text)
ابتدا چک می کنه که اگه متنی در Text1 نوشته نشده از روتین خارج بشه و سراغ عملیات تبدیل نره.
در سطر دوم دو کاراکتر vbCrLf که در انتهای سطر ها به عنوان نماد Enter وجود دارند را به یک کاراکتر فاصله تبدیل می کنه.
در سطر سوم هم معدل باینری رشته را در Text2 می نویسه.

مورد دوم در کد فراخوانی اولیه فرم است :
کد:
Private Sub Form_Load()
    For Each Ctrl In Me
        Ctrl.Font = "Tahoma"
    Next
End Sub
این کد هر کنترلی که در داخل مجموعه Me (فرم اصلی برنامه) وجود داره رو در یک حلقه به عنوان متغیر Ctrl فرض می کنه.
بعد در داخل حلقه فونت آنها را به "Tahoma" تغییر می دهد.
با اجرا شدن این کد تمامی کنترلهای داخل فرم از فونت Tahoma استفاده می کنند.

تصور می کنم که تشریح کد کوتاه تر و ساده تری که خودم نوشته ام (نیازی به تابع StrRev یا StrReverse نداره) بهتر باشه :
پس دوباره اونرو اینجا سطر به سطر می نویسم :
کد:
Public Function Str2Bin(ByVal Source As String) As String
یک تابع که ورودی اش یک رشته با عنوان Source است و خروجی اش هم یک رشته String است.

کد:
    Dim Index As Long, Code As Long, Bit As Long
سه متغیر محلی در این تابع وجود دارند که Index شماره کاراکتری است که قرار است تبدیل شود.
Code کد عددی آن کاراکتر در جدول ASCII است.
Bit اندیس ای است که معدل بیتی اش استخراج می شود، بین 0 الی 7.

کد:
    For Index = 1 To Len(Source)
ابتدا در یک حلقه کلیه کاراکتر ها را با Index از شماره 1 الی طول رشته Source پیمایش می کنیم.

کد:
        Code = Asc(Mid(Source, Index, 1))
Code کد عددی کاراکتری را در بر می گیرد که Index شماره آنرا نشان می دهد.

کد:
        For Bit = 7 To 0 Step -1
حالا باید از بیت اندیس 7 الی اندیس 0 را در کد کاراکتر پیمایش کنیم (از ارزش بالاتر به سمت ارزش پایین تر).
این پیمایش برعکس ما را از بکارگیری تابع StrRev و StrReverse بی نیاز می کند.

کد:
            Str2Bin = Str2Bin & IIf((Code And (2 ^ Bit)) = 0, "0", "1")
و در انتها 2 را به توان شماره اندیس (Bit) می رسانیم و در کد کاراکتر (Code) با عملگر AND چک می کنیم.
اگر حاصل صفر باشد یعنی آن بیت صفر است وگرنه یک است.
در هر صورت آنرا به مقادیر قبلی داخل رشته Str2Bin اضافه می کنیم.
کد:
        Next
    Next
End Function
در انتها دو حلقه For بسته می شوند و تابع با مقدار خروجی Str2Bin خاتمه می یابد.
 

جدیدترین ارسال ها

بالا