C# 从二进制数据库中提取压缩数据

C# 从二进制数据库中提取压缩数据,c#,binary,compression,C#,Binary,Compression,我有一个c-treeAce数据库,它以压缩的形式存储数据。我相信它正在使用zlib,但我不能确定。一旦我通过了最初的头信息,这似乎是压缩形式的第一对记录 80 32 E4 96 48 59 0B BD 6F 21 D3 85 37 E9 FA AC 5E 10 C2 74 26 D8 8A 9B 4D FF B1 63 15 C7 79 2B 3C EE A0 52 04 B6 68 1A CC DD 8F 41 F3 A5 57 09 BB 6D 7E 30 E2 94 46 F8 AA

我有一个c-treeAce数据库,它以压缩的形式存储数据。我相信它正在使用zlib,但我不能确定。一旦我通过了最初的头信息,这似乎是压缩形式的第一对记录

80 32 E4 96 48 59 0B BD 6F 21 D3 85 37 E9 FA AC 5E 10 C2 74 26 D8 8A 9B 
4D FF B1 63 15 C7 79 2B 3C EE A0 52 04 B6 68 1A CC DD 8F 41 F3 A5 57 09 BB 
6D 7E 30 E2 94 46 F8 AA 5C 0E 1F D1 83 35 E7 99 4B FD AF C0 72 24 D6 88 3A 
EC 9E 50 61 13 C5 77 29 DB 8D 3F F1 02 B4 66 18 CA 7C 2E E0 92 A3 55 07 B9 
6B 1D CF 81 33 44 F6 A8 5A 0C BE 70 22 D4 E5 97 49 FB AD 5F 11 C3 75 86 38 
EA 9C 4E 00 B2 64 16 27 D9 8B 3D EF A1 53 05 B7 C8 7A 2C DE 90 42 F4 A6 58 
69 1B CD 7F 31 E3 95 47 F9 0A BC 6E 20 D2 84 36 E8 9A AB 5D 0F C1 73 25 D7 
89 3B 4C FE B0 62 14 C6 78 2A DC ED 9F 51 03 B5 67 19 CB 7D 8E 40 F2 A4 56 
08 BA 6C 1E 2F E1 93 45 F7 A9 5B 0D BF D0 82 34 E6 98 4A FC AE 60 71 23 D5 
87 39 EB 9D 4F 01 12 C4 76 28 DA 8C 3E F0 A2 B3 65 17 C9 7B 2D DF 91 43 54 
06 B8 6A 1C CE 80 32 E4 F5 A7 59 0B BD 6F 21 D3 85 96 48 FA AC 5E 10 C2 74 
26 37 E9 9B 4D FF B1 63 15 C7 D8 8A 3C EE A0 52 04 B6 68 79 2B DD 8F 41 F3 
A5 57 09 1A CC 7E 30 E2 94 46 F8 AA BB 6D 1F D1 83 35 E7 99 4B 5C 0E C0 72 
24 D6 88 3A EC FD AF 61 13 C5 77 29 DB 8D 9E 50 02 B4 66 18 CA 7C 2E 3F F1 
A3 55 07 B9 6B 1D CF E0 92 44 F6 A8 5A 0C BE 70 81 33 E5 97 49 FB AD 5F 11 
22 D4 86 38 EA 9C 4E 00 B2 C3 75 27 D9 8B 3D EF A1 53 64 16 C8 7A 2C DE 90 
42 F4 05 B7 69 1B CD 7F 31 E3 95 A6 58 0A BC 6E 20 D2 84 36 47 F9 AB 5D 0F 
C1 73 25 D7 E8 9A 4C FE B0 62 14 C6 78 89 3B ED 9F 51 03 B5 67 19 2A DC 8E 
40 F2 A4 56 08 BA CB 7D 2F E1 93 45 F7 A9 5B 6C 1E D0 82 34 E6 98 4A FC 0D 
BF 71 23 D5 87 39 EB 9D AE 60 12 C4 76 28 DA 8C 3E 4F 01 B3 65 17 C9 7B 2D 
DF F0 A2 A2 54 B8 8A 1C CE 68 91 43 F5 A7 59 0B BD F5 22 32 E4 ED 41 FA AC 
5E 10 C2 D3 4D 37 E9 9B A3 CA AA BE F1 55 1D 8A 3C EE A0 52 04 15 C7 79 2B 
DD 8F 41 F3 A5 B6 68 1A CC 7E 30 E2 94 46 57 30 E2 94 46 F8 AA 5C 0E 1F D1 
83 35 E7 99 4B FD AF C0 72 24 D6 88 3A EC 9E 50 61 13 C5 77 29 DB 8D 3F F1 
02 B4 66 18 CA 7C 2E E0 92 A3 55 07 B9 6B 1D CF 81 33 44 F6 A8 5A 0C BE 70 
22 D4 E5 97 49 FB AD 5F 11 C3 75 86 38 EA 9C 4E 00 B2 64 16 27 D9 8B 3D EF 
A1 53 05 B7 C8 7A 2C DE 90 42 F4 A6 58 69 1B CD 7F 31 E3 95 47 F9 0A BC 6E 
20 D2 84 36 E8 9A AB 5D 0F C1 73 25 D7 89 3B 4C FE B0 62 14 C6 78 2A DC ED 
9F 51 03 B5 67 19 CB 7D 8E 40 F2 A4 56 08 BA 6C 1E 2F E1 93 45 F7 A9 5B 0D 
BF D0 82 34 E6 98 4A FC AE 60 71 23 D5 87 39 EB 9D 4F 01 12 C4 76 28 DA 8C 
3E F0 A2 B3 65 17 C9 7B 2D DF 91 43 54 06 B8 6A 1C CE
我知道保存的数据有以下字段:

timestamp   8
character   50
character   50
varchar 4096
我有以下基本的解压缩方法:

[DllImport("zlib1.dll", CallingConvention = CallingConvention.Cdecl)]  //here I am using the same dll as the application in case it was modified
static extern int uncompress(ref byte[] dest, ref uint destLen, byte[] source, uint sourceLen);

public static byte[] DeCompressToString(byte[] data)
{
    uint _dLen = 8192;
    byte[] _d = new byte[_dLen];
    if (uncompress(ref _d, ref _dLen, data, (uint)data.Length) != 0)
        return null;
    byte[] result = new byte[_dLen];
    Array.Copy(_d, 0, result, 0, result.Length);
    return result;
}
然后,我尝试使用以下方法,以起始点和字节的所有可能组合对文件进行迭代以解压缩,但没有得到任何结果

FileNamePath = @"C:\TestFile.dat";
FileStream WorkingFile = new FileStream(FileNamePath, FileMode.Open, FileAccess.Read);
int GrabLength = 10000;
byte[] ByteArray = new byte[GrabLength];
WorkingFile.Position = 16384; //skip past header and null data
WorkingFile.Read(ByteArray, 0, GrabLength);

for (int i = 0; i < GrabLength; i++)
{
    byte[] NewByteArray = ByteArray.Skip(i).Take(GrabLength-i).ToArray();
    for (int t = 0; t < GrabLength - i; t++)
    {
        byte[] PartialByteArray = NewByteArray.Skip(0).Take(t).ToArray();
        try
        {
            var testDecompress = MainWindow.DeCompressToString(PartialByteArray);
            if (testDecompress != null)
            {
                Console.WriteLine(testDecompress); //breakpoint here was never reached.
            }
        }
        catch { }
    }
}
FileNamePath=@“C:\TestFile.dat”;
FileStream WorkingFile=newfilestream(FileNamePath,FileMode.Open,FileAccess.Read);
整数长度=10000;
byte[]ByteArray=新字节[GrabLength];
WorkingFile.Position=16384//跳过过去的头和空数据
WorkingFile.Read(ByteArray,0,GrabLength);
for(int i=0;i

假设一行的压缩长度小于未压缩行的4200,它似乎应该找到至少一个可以解压缩的字节数组。

调查存储此数据的内容并确定。我有,唯一让我不确定的是,这里列出的ZLIB头与开始字节不匹配。为什么要直接访问文件系统中的原始数据库信息?你通常不应该这样做。您不能加载数据库并通过适当的接口查询它吗?应该有一个nuget——除非这是一个全新的产品,而您是构建nuget的人……也许它只是二进制序列化。@TheAtomic选项我没有通过ODBC访问完整数据库的权限。在DB的过去版本中,这些文件都是平面数据文件,我手动解析了这些记录。现在尝试对压缩的记录执行相同的操作。