سؤال

لدي تطبيق ويب تم تطويره في Adobe Flex 3 و Python 2.5 (منتشر على محرك تطبيق Google). تم إنشاء خدمة ويب مريحة في Python ونتائجها موجودة حاليا بتنسيق XML يتم قراءتها عن طريق Flex باستخدام كائن HTTSService.

الآن الهدف الرئيسي هو ضغط XML بحيث يكون هناك أقل وقت بين طريقة إرسال HTTService وإرسال الأحداث. نظرت إلى مستندات Python وتمكنت من استخدام zlib.compress () لضغط نتيجة XML.

ثم قمت بتعيين نوع النتيجة HTTSService من "XML" إلى "النص" وحاول استخدام bytearrays لإلغاء ضغط السلسلة مرة أخرى إلى XML. هنا حيث فشلت. أنا أفعل شيئا مثل هذا:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

رمي استثناء في bytearray.uncompress () ويقول غير قادر على إلغاء ضغط bytearray. أيضا عندما أتبع طول bytearray يحصل على 0.

غير قادر على معرفة ما أفعله خطأ. كل المساعدة موضع تقدير.

-- يحرر --

الرمز:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

الحدث من النوع نتيجة.

الخطأ:

خطأ: خطأ # 2058: حدث خطأ إلغاء ضغط البيانات.

يمكن أن يكون الخطأ لأن قيمة bytearray.bytesavailable = 0 وهذا يعني أن بايتون البايت الخام التي تم إنشاؤها لم تتم كتابةها في bytearray بشكل صحيح ..

- SRI.

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

المحلول

ما هو byteArray.writeUTF( event.result.toString() ); من المفترض أن يفعل؟ نتيجة Zlib.compress () ليست Unicode ولا "UTF" (لا معنى لها دون رقم بعد ذلك!)؛ إنه البايت الخام الثنائية يجب أن لا تفصيحها ولا تشفيرها أو تطبيق أي تحويل آخر لها. يجب أن يؤدي جهاز الاستقبال إلى إلغاء ضغط البايت الخام على الفور أنه يتلقى، من أجل استعادة البيانات التي تم تمريرها إلى Zlib.compress ().

تحديث ما الوثائق التي يجب عليك دعم فكرة ذلك byteArray.uncompress() يتوقع حقيقة zlib. تيار وليس فرط تيار (أي دفق ZLIB بعد أن قمت بتحالف أول 2 بايت و 4 آخر)؟

وثائق المرن 3 من bytearray. يعطي هذا المثال:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

ولكن غير مفيد لا يقول ما هو الافتراضي (إن وجد). إذا كان هناك افتراضي، فهو غير موثق في أي مكان واضح، لذلك سيكون فكرة جيدة جدا لاستخدامها

bytes.uncompress(CompressionAlgorithm.ZLIB);

لجعل الأمر واضحا ما تنوي.

والمستندات تتحدث عن writeUTFBytes الطريقة، وليس writeUTF طريقة. هل أنت متأكد من انسخ / لصق رمز الاستقبال الدقيق في سؤالك؟

تحديث 2.

شكرا على عنوان URL. يبدو أنني حصلت على "مساعدة"، وليس المستندات الحقيقية: = (. بضع نقاط:

(1) نعم، هناك صريح inflate() طريقة. ومع ذلك، فإنه لا يحتوي على خوارزمية Arg؛ يمكن أن يكون إما compressionalgorithm.zlib (الافتراضي) أو compressionalgorithm.deflate ... من المثير للاهتمام أن الأخير متاح فقط في Adobe Air، وليس في Flash Player. على الأقل نعرف أن مكالمة غير قابلة لإعادة ضغط () تظهر موافق، ويمكننا العودة إلى مشكلة الحصول على البايت الخام على السلك وإيقاف مرة أخرى في مثيل bytearray.

(2) والأهم من ذلك، هناك كلاهما writeUTF (يكتب سلسلة UTF-8 إلى دفق البايت. يتم كتابة طول سلسلة UTF-8 في البايت أولا، كعدد صحيح 16 بت، تليها البايت التي تمثل أحرف السلسلة) و writeUTFBytes (يكتب سلسلة UTF-8 إلى دفق البايت. مماثلة لطريقة TRADEUTF ()، ولكن لا بادئة ReadUTFBYTES () بادئة السلسلة باستخدام كلمة طول 16 بت).

مهما كانت مزايا توفير البيولوجي المشفرة UTF8 (NIL، IMHO)، فأنت لا تريد بادئة طول 2 بايت هناك؛ باستخدام TradeUTF () مضمون للتسبب في عدم إلغاء ضغط () إلى Bork.

الحصول عليه على السلك: استخدام Python Print على البيانات الثنائية لا يبدو فكرة جيدة (ما لم يتم نفايات syss.stdout لتشغيلها في الوضع الخام، والتي لم تظهر في التعليمات البرمجية الخاصة بك).

وبالمثل القيام به Event.Result.tostring () الحصول على سلسلة (على غرار كائن Unicode Python، نعم / لا؟) - مع ما وبعد ذلك ترميزه في UTF-8 يبدو من غير المرجح أن يعمل.

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

(1) القيام ببعض التصحيح. انقر فوق ابدأ مع مستند XML الحد الأدنى. يعرض repr(xml_doc). وبعد يعرض repr(zlib_compress_output). وبعد في (إصدار مقطوع من) البرنامج النصي المرن، استخدم أقرب وظيفة / طريقة ل repr() يمكنك أن تجد لإظهار: event.result, event.result.toString() ونتيجة writeUTF*(). وبعد تأكد من أنك تفهم آثار كل ما يمكن أن يحدث بعد zlib.compress (). قراءة المستندات قد تساعد بعناية.

(2) انظر إلى كيف يمكنك الحصول على بايت الخام من الحدث.

هث، جون

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