29-04-18, 04:18 PM
مقدمة
في هذا الموضوع سنوضح كيفية بناء نظام ترميز ثنائي من الصفر بدون أن تعتمد علي الكلاسات الموجودة في الدوت نت إلا في ما تيسر مثل استخدام الأساسيات فقط من الأنواع التالية
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
وهنا نحن نحسب عدد مرات التكرار فقط بدون أن نضيف الحرف صفر او الحرف واحد
الكود:
الكود التالي يوضح واحدة من الطرق للتعامل مع الحروف الأبجدية و تحويلها الي بيناري ثم الي رقم
الكود أعلاه يمكن تحويله الي دوال كالتالي
أتمني أن يكون الموضوع مفيدا للبعض منكم
ولاحقا سوف أكمل بقية الموضوع
تقبلوا تحياتي
في هذا الموضوع سنوضح كيفية بناء نظام ترميز ثنائي من الصفر بدون أن تعتمد علي الكلاسات الموجودة في الدوت نت إلا في ما تيسر مثل استخدام الأساسيات فقط من الأنواع التالية
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 (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"))
Return result
End Function
Private Function ZipToLong(value As Char) As Long
Return Long.Parse(Me.ZipToString(value))
End Function
أتمني أن يكون الموضوع مفيدا للبعض منكم
ولاحقا سوف أكمل بقية الموضوع
تقبلوا تحياتي
Retired

