تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
بناء نظام ترميز ثنائي Binary Encoding
#1
مقدمة
في هذا الموضوع سنوضح كيفية بناء نظام ترميز ثنائي من الصفر بدون أن تعتمد علي الكلاسات الموجودة في الدوت نت إلا في ما تيسر مثل استخدام الأساسيات فقط من الأنواع التالية
String او Long أو Integer أو Byte أو المصفوفات .... الخ

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

وللتوضيح أكثر قليلا فإنه يمكن تفسيير الأمر كالتالي

1- نحدد الحرف الأبجدي
2- نحصل علي قيمة الأسكي الخاصة بهذا الحرف ونقوم بتحويلها إلي بيناري تكست
3- نقوم بتحويل البيناري تكست الي رقم هذا الرقم مثلا قد يكون من النوع Long
4- و بعد ذلك و بعملية عكسية نعيد الرقم الي حرف أبجدي مرة ثانية
بشكل عام هذا الموضوع ممكن اعتباره أساس جيد للاستخدام في موضوعات مثل الباركود او في ضغط البيانات او في تغيير شكل البيانات

مثال توضيحي:
الحرف الأبجدي ------------------------------------------------------------------------------------------- A
رقم الأسكي الخاص به يساوي ------------------------------------------------------------------------ 65
وعند تجويله مثلا الي بيناري تكست قد يعطينا الشكل ----------------------------------------------- 001000001
وعند تحويل البيناري تكست الي رقم يمكننا أن نحصل علي الشكل هذا --------------------------- 20115011
أو يمكن أن نحصل علي الشكل هذا -------------------------------------------------------------------  2151
أو يمكن أن نحصل علي الشكل هذا -------------------------------------------------------------------------  215100

عموما الفكرة تنحصر في حساب عدد مرات تكرار الرقم في البيناري تكست
ثم بعد ذلك نصيف الحرف المتكرر علي يمين هذا الرقم

مثلا الييناري   00000011
الصفر متكرر 6 مرات و الرقم واحد متكرر مرتين و بالتالي نحصل علي الرقم 6021
حيث الرفم 6 يمثل عدد مرات تكرار الرقم صفر و الحرف الثاني هو الرقم صفر نفسه فنحصل غلي 60
و الرقم 2 هو عدد مرات تكرار الرقم واحد و الحرف الذي يليه هو الرقم واحد نفسه فنحصل علي  21
ويتم دمجهم معا فنحصل غلي الرقم 6021

أو يمكن الاستغناء عن اضافة الحرف الأبجدي تماما
مثلا البيناري اعلاه 00000011
يمكن تحويله الي الرقم 62
وهنا نحن نحسب عدد مرات التكرار فقط بدون أن نضيف الحرف صفر او الحرف واحد

الكود:
الكود التالي يوضح واحدة من الطرق للتعامل مع الحروف الأبجدية و تحويلها الي بيناري ثم الي رقم
PHP كود :
       ' تعريف الحرف الأبجدي
        Dim chr As Char = "A"c
        ' 
تحويل الحرف الأبجدي الي أسكي
        Dim code 
As Integer AscW(chr)

 
       ' تحويل قيمة الأسكي الي بيناري تكست
        Dim binary As String = String.Empty
        While code > AscW(Char.MinValue)
            Dim v As Integer = (code And 1)
            binary = v.ToString + binary
            code = code >> 1
        End While
        ' 
تحديد عدد الأصفار المطلوب اضافتها علي يسار البيناري تكست
        
' من الأفضل أن لايقل عدد الأصفار عن 2 و أيضا لا يزيد عن 8
        Dim padWidth As Integer = 2
        ' 
إضافة مجموعة من الأصفار علي يسار البيناري تكست
        binary 
binary.PadLeft(binary.Length padWidth"0"c)

 
       ' إحسب عدد مرات تكرار كل حرف في البيناري و أضفهم الي مصفوفة
        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 (i < binary.Length)
            If (current = binary(i)) Then
                count = (count + 1)
            Else
                values.Add(count)
                count = 1
                current = binary(i)
            End If
            i = (i + 1)
        End While
        values.Add(count)

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

        
' لو أن رقم الأسكي عبارة عن رقم فردي أضف صفران في اخر الناتج
        ' 
لو أن رقم الأسكي عبارة عن رقم زوجي أضف صفرا واحدا في أخر الناتج
        
' الفكرة من استخدام هذه الطريقة هي أن نتمكن من استرداد قيمة حرف الأسكي لاحقا
        result = If(code Mod 2 <> 0, result + New String("0", 2), result + New String("0")) 


الكود أعلاه يمكن تحويله الي دوال كالتالي

PHP كود :
   Private Function ZipToString(chr As Char) As String

        Dim code 
As Integer AscW(chr)
 
       Dim binary As String String.Empty
 
       While code AscW(Char.MinValue)
 
           Dim v As Integer = (code And 1)
 
           binary v.ToString binary
            code 
code >> 1
        End 
While
 
       Dim padWidth As Integer 2
        binary 
binary.PadLeft(binary.Length padWidth"0"c)

 
       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)

 
       Dim result As String String.Empty
 
       For Each v As Integer In values
            result 
+= v.ToString
        Next

        result 
= If(code Mod 2 <> 0result + New String("0"2), result + New String("0"))
 
       Return result
    End 
Function

 
   Private Function ZipToLong(value As Char) As Long
        Return Long
.Parse(Me.ZipToString(value))
 
   End Function 

أتمني أن يكون الموضوع مفيدا للبعض منكم
ولاحقا سوف أكمل بقية الموضوع
تقبلوا تحياتي
Retired
الرد }}}
تم الشكر بواسطة: sendbad100 , ابو ليلى


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


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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم