قم بتنزيل التورنت بسعة 16 جيجابايت عبر الجهاز اللوحي مع مساحة خالية تبلغ 4 جيجابايت


الهدف:


يوجد جهاز كمبيوتر بدون الإنترنت ولكن من الممكن نقل الملف عبر USB. يوجد جهاز لوحي به شبكة إنترنت يمكن نقل هذا الملف منه. على الجهاز اللوحي ، يمكنك تنزيل السيل المطلوب ولكن لا توجد مساحة كافية. الملف في سيل واحد وكبير.


الطريق إلى الحل:


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


نظرًا لحقيقة أن عميل التورنت يقوم بتعيين العلامة المتفرقة على ملف يكتب فيه البيانات المستلمة ، فإن النظام لا يحاول على الفور حجز 16 جيجا بايت ولن يكون هناك أي خطأ عند محاولة الكتابة إلى ملف يتجاوز 4 جيجابايت.


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


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


تحميل سيل في أجزاء


  1. بدء تنزيل سيل على الجهاز الأول
  2. انتظر حتى يتم ملء ROM
  3. توقف التحميل
  4. نقل الملف إلى الجهاز الثاني وإضافة رقم إلى اسم الملف
  5. ارجع إلى النقطة الأولى حتى يتم تنزيل الملف بالكامل

دمج أجزاء في ملف واحد


بعد استلام الجزء الأخير ، من الضروري تجميعها في ملف واحد كامل.


المهمة بسيطة:


  1. قراءة جميع الأجزاء في وقت واحد
  2. إذا كانت البايت غير الصفرية مكتوبة في الإخراج في جزء ما في المخرجات ، وإلا فإننا نكتب صفر

تأخذ الدالة merge_part مجموعة من التدفقات streams_in التي تقرأ منها جزءًا من حجم buffer_length وترجع نتيجة دمج الأجزاء من التدفقات المختلفة.


 function merge_part(streams_in, buffer_length) local out_part for _, stream in ipairs(streams_in) do local in_part = stream:read(buffer_length) if not out_part then out_part = in_part --       elseif in_part and #in_part > 0 then if #out_part < #in_part then out_part, in_part = in_part, out_part end if out_part ~= in_part --   and in_part:find("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

إن وظيفة string.gsub مناسبة للمهمة حيث ستجد قطعًا مملوءة string.gsub ما تم تمريره إليها.


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

string.gsub لا يتجاوز الموضع الذي تم العثور على تطابق فيه. لذلك ، نقوم بالبحث المتوازي عن الموضع zero_string باستخدام دالة string.find . يكفي العثور على البايت صفر الأول.


 --]] local start_index = out_part:find("\0", find_index, true) find_index = start_index + #zero_string --[[ 

الآن ، إذا كان لدى in_part بيانات لـ out_part بنسخها.


 --]] if #in_part >= start_index then local end_index = start_index + #zero_string - 1 --[[ 

قمنا بقص الجزء المقابل لتسلسل الأصفار من in_part .


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

هناك بيانات في part .


 --]] if #part == #zero_string then return part else --[[ 

تحول part إلى أن يكون أقل من سلسلة من الأصفار. نحن نكملها معهم.


 --]] return part..zero_string:sub(1, end_index - #in_part) end end end end) end end end return out_part end 

استنتاج


وبالتالي ، كان من الممكن تنزيل وتجميع هذا الملف على جهاز كمبيوتر. بعد عملية الدمج ، قمت بسحب ملف تورنت من الجهاز اللوحي. قمت بتثبيت العميل سيل على جهاز الكمبيوتر والتحقق من الملف معها.


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


يستخدم:


  1. سيل العميل Flud على الجهاز اللوحي.
  2. QBittorent سيل العميل على جهاز الكمبيوتر.
  3. النصي لوا

Source: https://habr.com/ru/post/ar473636/


All Articles