"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني تحويل صفائف البايت إلى أعداد صحيحة وعوامات موقعة في Go؟

كيف يمكنني تحويل صفائف البايت إلى أعداد صحيحة وعوامات موقعة في Go؟

تم النشر بتاريخ 2024-11-07
تصفح:743

How can I convert byte arrays to signed integers and floats in Go?

تحويل صفائف البايت إلى أعداد صحيحة موقعة وعائمة في Go

في Go، توفر الحزمة الثنائية وظائف لتحويل الأعداد الصحيحة غير الموقعة من [] بايت المصفوفات، مثل ثنائي.LittleEndian.Uint16() وbinary.BigEndian.Uint32(). ومع ذلك، لا توجد معادلات مباشرة للأعداد الصحيحة الموقعة أو الأعداد العشرية.

سبب غياب وظائف تحويل الأعداد الصحيحة الموقعة

يرجع غياب وظائف تحويل الأعداد الصحيحة الموقعة في المقام الأول إلى حقيقة أن تفسير التمثيل الثنائي كقيمة موقعة أو غير موقعة هو مسألة منطق البرمجة. تحتوي مجموعة البايتات [] نفسها على بيانات ثنائية أولية فقط، والتي يمكن تفسيرها على أنها موقعة أو غير موقعة وفقًا لمتطلبات التطبيق.

كيفية التحويل إلى أعداد صحيحة موقعة

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

التحويل إلى Floats

يتطلب التحويل من الأعداد الصحيحة غير الموقعة إلى الأعداد العائمة مزيدًا من المشاركة. توفر حزمة الرياضيات وظائف لهذا الغرض: math.Float32frombits() و math.Float64frombits(). على العكس من ذلك، يمكن استخدام math.Float32bits() وmath.Float64bits() للحصول على التمثيل الصحيح غير الموقع للقيم العائمة.

استخدام Binary.Read() وBinary.Write()

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

مثال على استخدام Binary.Read () للتحويل العائم

خذ بعين الاعتبار ما يلي مثال:

b := []بايت{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}

فار بي float64
buf := bytes.NewReader(b)
يخطئ := ثنائي.قراءة(buf, ثنائي.LittleEndian, &pi)
إذا أخطأت!= لا شيء {
    fmt.Println("فشل القراءة الثنائية:"، خطأ)
}

fmt.Println(pi) // الإخراج: 3.141592653589793
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3