我不确定这个论坛是否适合提出这样的问题,但我真的找不到更好的地方,所以让我提前为此道歉。
我正在尝试读取第三方数据库以实现互操作性目的,但我很难处理一个特定的表。该表有两列:blobSize 和 blob。 Blob 大小是一个整数,blob 是一个字节数组。
我猜这个字段是基于两个假设压缩的:
1) blobsize 与 blob 字段的实际大小不对应,例如,我将在帖子末尾发布的 blob 有 294 字节,而 blobsize 告知大小为 2560。
2) blob 以 0x50 0x4B 0x01 0x02 (P K 1 2) 开头,这与 zip 文件 ( https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html#datadescriptor ) 的中央目录 header 非常相似。但是 zip 文件在文件开头有压缩数据,而中央目录在文件末尾。 blob 以类似于 zip 格式的 central directoy 开始,然后有很多数据,这是相反的。
我尝试使用 SevenZipSharp 和 XCeed Zip 库解压缩数据,但没有成功。由于此数据是在应用程序中生成的(而不是压缩文件),因此 blob 中不会有任何关于文件名、大小、修改日期等的信息,并且这些库期望数据来自文件。
我还试图在字节中找到中央目录的每个元素,它们似乎遵循 zip 文件格式中指定的内容。中央目录部分中存在的一个特殊信息是压缩方法,在这些数据库字段中为“0x09 0x00”,应该是增强的 deflate (deflate64)。
也许我不知道如何用库解压缩这些数据,也许它们甚至不是压缩字段。也许对压缩数据或 zip 文件更有经验的人会指引我走向正确的道路。
此数据应包含某些数据库元素的几何信息。我也不认为它是一个加密字段,因为数据库中的所有其他数据都是二进制格式,但打开后我设法读取了它们。这是唯一让我头疼的领域。
例如,这里是一行的内容:
blobSize: 2560
Blob :
-
string hexa = "504B01021500150004000900C0480E470000C048FFFFFFFF000000000000000000000000FFFF0000000000000000BB705EF0C1C28D520F19D0801D0333C3BFFF9C0C6C48E28C4036088381000303139001E2FFFBFFFF3F44908101C81C550D007F81B1058A3F181E550D883C2A445610433E1096302830B832E401E922864A5856268A16636085E77978D9804367C164959D9DD72E303283E4A18A5D80F6BA31C433043384300401D98E0CBE3874631716636062440E06ECAA30456F610A912D428EFD645B86452325F683A201548E83E20454068CB6070037D552A6591CB3F7E3A0EDA1E2705A80C119585EE4321400C962864C608991CAE00EC4203103206460C06112CC06B849309365817AF0800FF6782491A43ED82FE3021B09564FA82842D238B29900";
byte[] bytes = Enumerable.Range(0, hexa.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexa.Substring(x, 2), 16))
.ToArray();
最佳答案
But zip files have the zipped data in the begining of the file and the central directory is in the end of the file.
没错,但是从您链接的页面来看,每个 zip 文件头都以字母“PK”或 0x50 0x4B 开头。这表明它至少看起来像一个 zip 文件,您可以尝试这样阅读它。
参见 Unzip a memorystream (Contains the zip file) and get the files举些例子。
关于c# - 试图弄清楚这个数据库文件是否有压缩数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32398644/