سؤال

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

كلمات الحكمة موضع تقدير كبير.

(defn block-seq
  ([block-size bytes]
    "reads a byte-seq into a sequence of block-size bits."
    (block-seq 8 block-size bytes))
  ([in-block-size out-block-size bytes]
    "converts a seq from in-block-size to out-block-size"
  ...

حدود:

  • in-block-size هو عدد البتات المهمة في كل رقم في تسلسل الإدخال
  • حجم الكتلة الخارجي هو عدد البتات المهمة في كل رقم من الأرقام الموجودة في التسلسل البطيء الذي يتم إرجاعه.
  • البايتات عبارة عن تسلسل بطيء من الأرقام يمكن استخراج البتات منها

فيما يلي مثال يأخذ تسلسلاً من ثلاث بايتات ويقسمه إلى تسلسل مكون من رقمين عشرين بت (ثم يطبعه كسلسلة ثنائية).

user> (map #(java.lang.Integer/toBinaryString %) (block-seq 20 [0xAA 0xAA 0xAA]))
("10101010101010101010" "1010")
user> 

الرقم الثاني في تسلسل أرقام 20 بت يحتوي فقط على أربع بتات مهمة ويحتوي على 16 صفرًا مضافًا.إذا قمت بعد ذلك بتمرير هذا التسلسل إلى وظيفة أخرى تريد القيام بشيء ما بالتسلسل وإرساله عبر الشبكة؛يحتاج الكود الموجود على الطرف المتلقي إلى معرفة عدم طباعة/تخزين/إلخ آخر 16 بت.

ملاحظة:يمكن تقييدها بالسلاسل.(block-seq 20 15 (block-seq 8 20 (قراءة بايت من ملف)))

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

المحلول

لا يزال من غير الواضح تمامًا ما تريد القيام به، ولكن يبدو أنك تريد معرفة أفضل طريقة لـ block-seq لإرجاع عدد البتات المبطنة في القطعة الأخيرة.بالطبع هذا غير ممكن مقدمًا إذا كنت تريد أن تكون كسولًا بشكل صحيح، لذا يجب إرجاع الرقم مع القطعة الأخيرة أو بعدها.

بدون استخدام البيانات الوصفية، يمكنك فقط إرجاع قائمة مثل

(1 2 3 :pad 12)

باستخدام البيانات الوصفية، يمكنك إضافة معلومات الحشو هذه إلى السلبيات الأخيرة (لا يمكن لـ Clojure إضافة بيانات تعريفية إلى الأعداد الصحيحة)، وبالتالي فإن السلبيات الأخيرة ستكون مكافئة لـ

(with-meta '(3) {:pad 12})

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

ومع ذلك، فإن كيفية نقل معلومات الحشو عبر السلك هو سؤال آخر.

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