تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Code Snippet: Convert From Ulong To Byte Array & Vice Versa
#1
فكرة كتابة الكود بدأت بفكرة خظرت في عفلي و هي اعادة كتابة بعضا من الدوال الموجودة في الدوت نت
واكتشفت إن الموضوع عبارة عن صداع خفيف و يحتاج الي وقت
لكنه و في نفس الوقت صداع حلو خصوصا عندما ينتهي هذا الصداع بأن تتوصل للحل

وبدأت رحلة البحث علي النت .........
ووجدت بعص الأفكار لكن أغلب الأفكار كان بها 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 8
            Dim b 
As Byte CByte((value And patterns(i)) >> mask)
 
           bytes(i) = b
            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 = (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 = (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 
2- التحويل من Uinteger الي مصفوفة بايت و العكس
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 = (8)
 
           Dim b As Byte CByte((value And patterns(i)) >> mask)
 
           bytes(i) = b
            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 = (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 = (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 
3- التحويل من UShort الس مصفوفة بايت و العكس

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 = (8)
 
           Dim b As Byte CByte((value And patterns(i)) >> mask)
 
           bytes(i) = b
            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 = (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 = (1)
 
       End While
 
       Return (values(0) << 0) And patterns(0) Or (values(1) << 8) And patterns(1)
 
   End Function 

الخلاصة ميكروسوفت بتوفر علينا وقت كبيير
لكن ولكي تخرج من عباءة مايكروسوفت يبقي لازم نجتهد و نبذل الوقت و الجهد

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



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


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