كيفية تحليل ملف ثنائي مع عوامات (ولدت جافا) باستخدام الكاكاو اللمس؟

StackOverflow https://stackoverflow.com/questions/401783

  •  03-07-2019
  •  | 
  •  

سؤال

ونظرا للجافا البرمجية التالية لتوليد ملف ثنائي:

DataOutputStream out = new DataOutputStream(new FileOutputStream("foo.dat"));
out.writeInt(1234);
out.writeShort(30000);
out.writeFloat(256.384f);

وأنا باستخدام رمز الهدف جيم التالية وإدارتها لتحليل int و القيم قصيرة:

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"dat"];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];

unsigned long intValue;
memcpy(&intValue, [[file readDataOfLength:4] bytes], 4);
intValue = NSSwapBigLongToHost(intValue);

unsigned short shortValue;
memcpy(&shortValue, [[file readDataOfLength:2] bytes], 2);
shortValue = NSSwapBigShortToHost(shortValue);

ومشكلتي الآن هي مع قيمة تعويم: أي أدلة حول كيفية تحليل ذلك

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

المحلول

وفقط لنا وظائف وأنواع المقدم من قبل <Foundation/Foundation.h>.

NSSwappedFloat bigEndianFloat;
memcpy(&bigEndianFloat, [[file readDataOfLength:4] bytes], 4);
float floatValue = NSSwapBigFloatToHost(bigEndianFloat);

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

نصائح أخرى

وآسف لأنني لا يمكن أن توفر الحل الكامل، ولكن ما يمكنني قوله هو حفظ تعويم جافا في الملف كملف أربعة بايت IEEE 754 تمثيل تعويم حسب هذه الوثيقة:

HTTP: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Float.html#floatToIntBits(float)

وهذا يصف هيكل الدقيق للقيمة حفظ، لذلك يمكن قراءتها في أنها int و يدويا تحليل بت لsignificand وداعية الى تعويم. فإنه لا يبدو أن تكون هناك دعوة من المكتبة لتحليل القيم النقطة العائمة معبأة في كثافة العمليات من هذا الشكل. نأمل شخص آخر سوف نعرف من مكالمة مكتبة للتعامل مع هذا.

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