كيف يمكنني إرسال البيانات الثنائية لل7Z تنسيق أرشيف؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

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

std::ofstream ofs(archivename.c_str(), std::ios::binary|std::ios::trunc);

Byte signature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
Byte major = 0;
Byte minor = 3;

ofs.write((const char*)signature, 6);
ofs.write((const char*)major, 1);
ofs.write((const char*)minor, 1);

UInt64 offset = 0;
UInt64 size = 0;
UInt32 crc = 0;

ofs.write((const char*)offset, 4);
ofs.write((const char*)size, 8);
ofs.write((const char*)crc, 8);
ofs.write((const char*)CrcCalc(0, 0), 8);

ofs.close();

وأعتقد أن مشكلتي الرئيسية هي عدم فهم الأمراض المنقولة جنسيا :: :: ofstream الكتابة (). البايت هو "الحرف غير الموقعة"، UInt64 وUInt32 على حد سواء "غير موقعة طويلة '.

على UPDATE0 : لوكما يشير الجميع بها، وانها تريد ان تكون مشكلة إذا ركضت هذا على جهاز الكبيرة endian. هذا ليس هو الحال هنا. لكل فريدريك يانسن، وأرجو أن يلقي عنوان غير المصفوفات. أود أن أذكر أيضا أن CrcCalc () هو دالة في SDK LZMA. واضاف ويساعد بعض الشيء، فهو أن الأول الحرف غير الموقعة [6] وهذا ما تواجه بعض المشاكل.

على UPDATE1 : ل. العمل رمز للحصول على ملف أرشيف فارغة أدناه

static void SetUInt32(Byte *p, UInt32 d)
{
  for (int i = 0; i < 4; i++, d >>= 8)
    p[i] = (Byte)d;
}

static void SetUInt64(Byte *p, UInt64 d)
{
  for (int i = 0; i < 8; i++, d >>= 8)
    p[i] = (Byte)d;
}

void make_7z_archive()
{
  CrcGenerateTable();

  std::ofstream ofs(archivename.c_str(), std::ios::binary|std::ios::trunc);

  Byte signature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
  Byte major = 0;
  Byte minor = 3;

  ofs.write((const char*)signature, 6);
  ofs.write((const char*)&major, 1);
  ofs.write((const char*)&minor, 1);

  UInt64 offset = 0;
  UInt64 size = 0;
  UInt32 crc = 0;

  Byte buf[24];
  SetUInt64(buf + 4, offset);
  SetUInt64(buf + 12, size);
  SetUInt32(buf + 20, crc);
  SetUInt32(buf, CrcCalc(buf + 4, 20));

  ofs.write((const char*)buf, 24);

  ofs.close();
}

ملحوظة: CrcGenerateTable () وCrcCalc () هي من SDK LZMA

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

المحلول

لا أعرف شكل 7Z، لكنني لاحظت عندما كنت أكتب تعويض، حجم واتفاقية حقوق الطفل أن هذه سوف تكون مكتوبة إلى ملف في تنسيق Endian طفيف (وأفترض أن يكون لديك وحدة المعالجة المركزية Endian طفيف).

وتحرير: هناك ربما أسوأ من ذلك، كنت في عداد المفقودين وقبل الكبرى والصغرى، ويقابل، حجم واتفاقية حقوق الطفل، أي كنت الصب القيم الفعلية لمؤشر

نصائح أخرى

واه ... أنا مرتبك. أنه يحتوي على SDK ... الذي كنت أذكر في مشاركتك ... أيضا مصادر 7 الرمز البريدي والانترنت . انظر أيضا p7zip على سورس. أنا فقط يحملق في مصادر p7zip وهناك مجموعة من الملفات التي تبدأ ب "7Z" التي تبدو كما لو كانت تفعل خدعة.

وأنا لم تستخدم صيغة 7Z programattically نفسي (فقط من خلال سطر الأوامر UTIL / GUI) ولكن لماذا تحتاج إلى التعامل مع هذه الأمور على مستوى منخفض نفسك وليس من خلال SDK؟ (بخلاف بسبب الترخيص LGPL)

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