08-05-18, 05:15 PM
(آخر تعديل لهذه المشاركة : 08-05-18, 05:17 PM {2} بواسطة silverlight.)
فكرة كتابة الكود بدأت بفكرة خظرت في عفلي و هي اعادة كتابة بعضا من الدوال الموجودة في الدوت نت
واكتشفت إن الموضوع عبارة عن صداع خفيف و يحتاج الي وقت
لكنه و في نفس الوقت صداع حلو خصوصا عندما ينتهي هذا الصداع بأن تتوصل للحل
وبدأت رحلة البحث علي النت .........
ووجدت بعص الأفكار لكن أغلب الأفكار كان بها Bug و غالبا هذا Bug كان في كيفية التحويل ثانية من مصفوفة البايت الي Ulong
عموما الكود الهدف منه مشاركة الأفكار مع بعضنا البعص و من يتسطيع أن يضيف دوالا أخري سأكون شاكرا له
وأخيرا انتهت التجربة بكتابة مجموعة من الدوال التالية
الدوال التالية تؤدي بعضا من المهام التي يؤديها الكلاس BitConverter والموجود في الدوت نت
1- التحويل من Ulong الي مصفوفة بايت و العكس
2- التحويل من Uinteger الي مصفوفة بايت و العكس
3- التحويل من UShort الس مصفوفة بايت و العكس
الخلاصة ميكروسوفت بتوفر علينا وقت كبيير
لكن ولكي تخرج من عباءة مايكروسوفت يبقي لازم نجتهد و نبذل الوقت و الجهد
أتمني أن تكون الدوال مفيدة للبعض منكم
تقبلوا تحياتي
واكتشفت إن الموضوع عبارة عن صداع خفيف و يحتاج الي وقت
لكنه و في نفس الوقت صداع حلو خصوصا عندما ينتهي هذا الصداع بأن تتوصل للحل
وبدأت رحلة البحث علي النت .........
ووجدت بعص الأفكار لكن أغلب الأفكار كان بها Bug و غالبا هذا Bug كان في كيفية التحويل ثانية من مصفوفة البايت الي Ulong
عموما الكود الهدف منه مشاركة الأفكار مع بعضنا البعص و من يتسطيع أن يضيف دوالا أخري سأكون شاكرا له
وأخيرا انتهت التجربة بكتابة مجموعة من الدوال التالية
الدوال التالية تؤدي بعضا من المهام التي يؤديها الكلاس BitConverter والموجود في الدوت نت
1- التحويل من Ulong الي مصفوفة بايت و العكس
PHP كود :
Private Function ToBytes(value As ULong) As Byte()
Dim patterns As ULong() = GetInt64Patterns()
Dim bytes As Byte() = New Byte(patterns.Length - 1) {}
Dim i As Integer = 0
While i < patterns.Length
Dim mask As Integer = i * 8
Dim b As Byte = CByte((value And patterns(i)) >> mask)
bytes(i) = b
i = (i + 1)
End While
Return bytes
End Function
Private Function GetInt64Patterns() As ULong()
Dim max As Integer = CInt(Byte.MaxValue)
Dim patternsize As Integer = System.Runtime.InteropServices.Marshal.SizeOf(GetType(ULong))
Dim patterns As ULong() = New ULong(patternsize - 1) {}
Dim i As Integer = 0
While i < patterns.Length
patterns(i) = CULng(max * (max + 1) ^ i)
i = (i + 1)
End While
Return patterns
End Function
Private Function ToInt64(bytes As Byte()) As ULong
Dim patterns As ULong() = Me.GetInt64Patterns()
Dim values As ULong() = New ULong(bytes.Length - 1) {}
Dim i As Integer = 0
While i < bytes.Length
values(i) = CULng(bytes(i))
i = (i + 1)
End While
Return (values(0) << 0) And patterns(0) Or (values(1) << 8) And patterns(1) Or (values(2) << 16) And patterns(2) Or
(values(3) << 24) And patterns(3) Or (values(4) << 32) And patterns(4) Or (values(5) << 40) And patterns(5) Or
(values(6) << 48) And patterns(6) Or (values(7) << 56) And patterns(7)
End Function
PHP كود :
Private Function ToBytes(value As UInteger) As Byte()
Dim patterns As UInteger() = GetInt32Patterns()
Dim bytes As Byte() = New Byte(patterns.Length - 1) {}
Dim i As Integer = 0
While i < patterns.Length
Dim mask As Integer = (i * 8)
Dim b As Byte = CByte((value And patterns(i)) >> mask)
bytes(i) = b
i = (i + 1)
End While
Return bytes
End Function
Private Function GetInt32Patterns() As UInteger()
Dim max As Integer = CInt(Byte.MaxValue)
Dim patternsize As Integer = System.Runtime.InteropServices.Marshal.SizeOf(GetType(UInteger))
Dim patterns As UInteger() = New UInteger(patternsize - 1) {}
Dim i As Integer = 0
While i < patterns.Length
patterns(i) = CUInt(max * (max + 1) ^ i)
i = (i + 1)
End While
Return patterns
End Function
Private Function ToInt32(bytes As Byte()) As UInteger
Dim patterns As UInteger() = Me.GetInt32Patterns()
Dim values As UInteger() = New UInteger(bytes.Length - 1) {}
Dim i As Integer = 0
While i < bytes.Length
values(i) = CUInt(bytes(i))
i = (i + 1)
End While
Return (values(0) << 0) And patterns(0) Or (values(1) << 8) And patterns(1) Or (values(2) << 16) And patterns(2) Or (values(3) << 24)
End Function
PHP كود :
Private Function ToBytes(value As UShort) As Byte()
Dim patterns As UShort() = GetInt16Patterns()
Dim bytes As Byte() = New Byte(patterns.Length - 1) {}
Dim i As Integer = 0
While i < patterns.Length
Dim mask As Integer = (i * 8)
Dim b As Byte = CByte((value And patterns(i)) >> mask)
bytes(i) = b
i = (i + 1)
End While
Return bytes
End Function
Private Function GetInt16Patterns() As UShort()
Dim max As Integer = CInt(Byte.MaxValue)
Dim patternsize As Integer = System.Runtime.InteropServices.Marshal.SizeOf(GetType(UShort))
Dim patterns As UShort() = New UShort(patternsize - 1) {}
Dim i As Integer = 0
While i < patterns.Length
patterns(i) = CUShort(max * (max + 1) ^ i)
i = (i + 1)
End While
Return patterns
End Function
Private Function ToInt16(bytes As Byte()) As UShort
Dim patterns As UShort() = Me.GetInt16Patterns()
Dim values As UShort() = New UShort(bytes.Length - 1) {}
Dim i As Integer = 0
While i < bytes.Length
values(i) = CUShort(bytes(i))
i = (i + 1)
End While
Return (values(0) << 0) And patterns(0) Or (values(1) << 8) And patterns(1)
End Function
الخلاصة ميكروسوفت بتوفر علينا وقت كبيير
لكن ولكي تخرج من عباءة مايكروسوفت يبقي لازم نجتهد و نبذل الوقت و الجهد
أتمني أن تكون الدوال مفيدة للبعض منكم
تقبلوا تحياتي
Retired