سؤال

أتساءل ما هي أفضل طريقة لتحويل صفيف البايت (الطول 4) إلى عدد صحيح في VB.NET؟ إنني على دراية بـ BitConverter ، لكن يبدو أنه من المثير للاخترفة إجراء دعوة وظيفة للقيام بشيء يجب أن يكون قادرًا على القيام بنسخ 4 بايت من الذاكرة. على نفس المنوال ، ماذا عن تحويل واحد/مزدوج من تمثيله الثنائي إلى متغير واحد/مزدوج.

هل كانت مفيدة؟

المحلول

"نسخ بايت للذاكرة" هو شيء غير مناسب بشكل خاص (و VB.NET أقل من ذلك). لذلك ، ما لم يكن التبديل إلى C هو خيار لك ، فإن استدعاء الوظائف أمر لا مفر منه إلى حد كبير لهذا الغرض.

BitConverter هي وظيفة مدروسة بشكل جيد. بالطبع ، يمكنك تجنب ذلك عن طريق القيام بشيء مثل (في C#):

myInt = (*pbyte) | (*(pbyte + 1) << 8)  | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);

(وهو ، بالمناسبة ، بالضبط ما يفعله BitConverter لك عند تحويل صفيف بايت إلى عدد صحيح ...).

ومع ذلك ، هذا الرمز:

  • من الصعب القراءة والفهم أكثر من ذلك بكثير من مكافئ BitConverter ؛
  • لا تفعل أي من الخطأ الذي يتحقق من BitConverter لك ؛
  • لا يفرق بين التمثيلات الصغيرة والإنديان الكبيرة ، مثل BitConverter.

بمعنى آخر: يمكنك "حفظ" مكالمة الوظائف ، لكنك ستكون أسوأ بكثير في النهاية (حتى على افتراض أنك لا تقدم أي أخطاء). بشكل عام ، تم تصميم إطار .NET جيدًا للغاية ، ويجب ألا تفكر مرتين في استخدام وظائفه ، إلا إذا واجهت مشكلات فعلية (الأداء) معها.

نصائح أخرى

إنني على دراية بـ BitConverter ، لكن يبدو أنه من المثير للاخترفة إجراء دعوة وظيفة للقيام بشيء يجب أن يكون قادرًا على القيام بنسخ 4 بايت من الذاكرة.

بينما أرى الموقف على أنه "يبدو أنه مضيعة للغاية تحاول أن ترمز إلى طريقة فعالة للقيام بذلك عندما تكون هناك بالفعل استدعاء طريقة تفعل بالضبط ما أريد."

إلا إذا كنت مقتنع تماما أن لديك عنق الزجاجة في الأداء في هذا الجزء الدقيق من التعليمات البرمجية ، استخدم الوظيفة التي يوفرها الإطار.

MDB صحيح تمامًا ، ولكن ، إليك بعض التعليمات البرمجية لتحويل مجموعة VB Byte إلى عدد صحيح Little Endian على أي حال ... (فقط في حال كنت ترغب في كتابة فئة BitConverter الخاصة بك)

"حيث يتم البتات () هي صفيف البايت الخاص بك من الطول 4

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))

يمكنك حظر نسخ البايت [] إلى int [] باستخدام فئة System.Buffer.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top