تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
بناء نظام ترميز ثنائي Binary Encoding
#4
في المشاركة السابقة تم توضيح كيفية تحويل الحرف الأبجدي الي رقم
و الخلاصة من الجزء الأول تنحصر في الدوال التالية

ملحوظة :
يجب أن تضع في اعتبارك دائما ان الحروف الأبجدية و التي رقم الأسكي الخاص بها عبارة عن رقم زوجي تعطي رقم أكبر من الحروف الأبجدية التي رقم الأسكي الخاص بها عبارة عن رقم فردي 
ولقد تم التعديل علي الكود قليلا لتفادي هذه المشكلة

الدوال: 
1- تحويل الحرف الي بيناري 

PHP كود :
   Private Function ConvertToBinary(code As Integer) As String
        Dim result 
As String String.Empty
 
       While code AscW(Char.MinValue)
 
           Dim v As Integer = (code And 1)
 
           result v.ToString result
            code 
code >> 1
        End 
While
 
       Return result
    End 
Function 

2- تحويل البيناري الي رقم
PHP كود :
   Private Function Zip(binary As String) As String

        Dim values 
As List(Of Integer) = New List(Of Integer)()
 
       Dim count As Integer 1
        Dim current 
As Char binary(0)
 
       Dim i As Integer 1
        While 
(binary.Length)
 
           If (current binary(i)) Then
                count 
= (count 1)
 
           Else
                values
.Add(count)
 
               count 1
                current 
binary(i)
 
           End If
 
           i = (1)
 
       End While
 
       values.Add(count)

 
       ' لتفادي مشكلة الحروف التي لها قيمة أسكي عبارة عن رقم زوجي أو فردي
        If (values.Count - 1) Mod 2 = 0 Then
            values.Add(0)
        End If

        ' 
تحويل المصفوفة الي تكست
        Dim result 
As String String.Empty
 
       For Each v As Integer In values
            result 
+= v.ToString
        Next
        Return result
    End 
Function 

الإستخدام

PHP كود :
       Dim chr As Char "b"c
        Dim code 
As Integer AscW(chr)
 
       Dim binary As String Me.ConvertToBinary(code)
 
       Dim padWidth As Integer 2
        binary 
binary.PadLeft(binary.Length padWidth"0"c)
 
       Dim zipped As String Me.Zip(binary) 


عملية استرجاع الحرف مرة ثانية من الرقم
تعتمد علي تحويل الرقم الي بيناري
ثم تحويل البيناري الي رقم يمثل رقم الأسكي الخاص بالحرف الأبجدي
و يمكنكم استخدام الدول التالية

الدوال:
1- تحويل الرقم الي بيناري ثانية
وهنا نعيد بناء البيناري من الحروف التي هي عبارة عن ارقام
PHP كود :
   Private Function UnZip(As String) As String
        Dim result 
As String ""
 
       Dim i As Integer 0
        While i 
s.Length
            result 
+= New String("0"cCInt(s(i).ToString))
 
           result += New String("1"cCInt(s(1).ToString))
 
           i = (2)
 
       End While
 
       Return result
    End 
Function 

2- تحويل البيناري الي رقم الأسكي ثانية

PHP كود :
   Private Function ConvertFromBinary(As String) As Integer
        Dim result 
As Integer 0
        Dim values 
As Char() = s.Reverse.ToArray
        Dim i 
As Integer 0
        While i 
values.Length
            If values
(i) = "1"c Then
                result 
CInt(Math.Pow(2i)) + result
            End 
If
 
           i = (1)
 
       End While
 
       Return result
    End 
Function 

الإستخدام

PHP كود :
       '  تحويل الرقم الي بيناري مرة ثانية 
        Dim unzipped As String = Me.UnZip(zipped)
        ' 
تحويل البيناري الي رقم
        Dim value 
As String Me.ConvertFromBinary(unzipped)
 
       ' تحويل الرقم الي حرف مرة ثانية
        Dim result As Char = ChrW(CInt(value)) 


المثال التالي يوضخ كيفية تحويل كلمة واخدة الي أرقام 
باستخدام الدوال اعلاه

PHP كود :
       Dim binaryValue As String String.Empty
 
       Dim s As String "abcds"
 
       Dim chars As Char() = s.ToCharArray
        For i 
0 To chars.Length 1
            Dim c 
As Char chars(i)
 
           Dim asciCode As Integer AscW(c)
 
           Dim b As String Me.ConvertToBinary(asciCode)
 
           Dim pad As Integer 4
            b 
b.PadLeft(b.Length pad"0"c)
 
           binaryValue += Me.Zip(b)
 
           binaryValue += " "c
        Next
        binaryValue 
binaryValue.TrimEnd(" "c
لو نظرت الي الناتج اعلاه ستجد ان الحروف التي لها رقم اسكي فردي تعطي قيمة اقل من الحروف التي لها رقم اسكي زوجي
و لتفادي ذلك يمكن التعديل قليلا علي الدالة الي تقوم بتحويل البيناري الي رقم لتكون كالتالي 

PHP كود :
  Private Function Zip(binary As String) As String

        Dim values 
As List(Of Integer) = New List(Of Integer)()
 
       Dim count As Integer 1
        Dim current 
As Char binary(0)
 
       Dim i As Integer 1
        While 
(binary.Length)
 
           If (current binary(i)) Then
                count 
= (count 1)
 
           Else
                values
.Add(count)
 
               count 1
                current 
binary(i)
 
           End If
 
           i = (1)
 
       End While
 
       values.Add(count)

 
       ' لتفادي مشكلة الحروف التي لها قيمة أسكي عبارة عن رقم زوجي أو فردي
        If (values.Count - 1) Mod 2 = 0 Then
            values.Add(0)
        Else
            values.Add(0)
            values.Add(0)
        End If

        ' 
تحويل المصفوفة الي تكست
        Dim result 
As String String.Empty
 
       For Each v As Integer In values
            result 
+= v.ToString
        Next
        Return result
    End 
Function 

أعتقد أنه لن يكون صعبا علي القارئ أن يقوم باسترجاع البيانات مرة ثانية
ملحوظة هامة:
لا تحاول تحويل مجموعة من الكلمات باستخدام الأسلوب اعلاه لأن الأمر يختاج الي كتابة المزيد من الدول و لهذا حديث أخر

طبعا الموضوع مجرد توضيح لبعض الأفكار و هناك اساليب اخري لتحويل الحرف الي ارقام و هذا متروك لمخيلة القارئ و فهمه الجيد للفكرة التي طرحناها

تقبلوا تحياتي
Retired
الرد }}}
تم الشكر بواسطة: sendbad100


الردود في هذا الموضوع
RE: بناء نظام ترميز ثنائي Binary Encoding - بواسطة silverlight - 01-05-18, 03:12 PM


التنقل السريع :


يقوم بقرائة الموضوع: