我已经浇过格式描述和源代码的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();

我想我的主要问题是缺乏的std :: ofstream的认识::写()。字节是一个“无符号字符”,UINT64&UInt32的都是“无符号长”。

UPDATE0 :由于每个人所指出的,这会是一个问题,如果我跑这大端机器上。这不是这里的情况。每弗雷德里克·扬森,我应该铸造非阵列的地址。我还要提到的是CrcCalc()是LZMA SDK的功能。添加和帮助一点,那就是第一无符号字符[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()是从LZMA SDK

有帮助吗?

解决方案

不知道的7z格式,但我注意到,当你写下偏移,这些将被写入到小尾数格式的文件(我假设你有一个小端CPU),大小和CRC。

编辑:一个可能是更糟的是,你错过了之前与主要,次要,偏移量,大小和CRC,即你是铸造的实际值的指针

其他提示

呃......我很困惑。它拥有您在您的文章提到的 SDK ......也是 7-ZIP来源是在线。也的p7zip 看在SourceForge上。我只是瞟了一眼来源的p7zip并有以“7z格式”,看上去就像他们会做的伎俩启动文件的一堆。

我没有使用过的7z格式programattically自己(只是通过命令行UTIL / GUI),但为什么你需要处理那些自己低层次的东西,而不是通过SDK? (除了由于LGPL许可)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top