c# - 从二进制数据库中提取压缩数据
问题描述
我有一个 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 { }
}
}
假设一行的压缩长度会小于未压缩行的 4200,那么它似乎应该找到至少一个可以解压缩的字节数组。
解决方案
推荐阅读
- multithreading - Flutter Platform Channels - 在 android 上调用 channel 方法,挂起 ui
- r - lme4:处理 lmer “收敛代码:0”
- c# - DateRangePicker MVC 剃须刀
- python - 没有注册 OpKernel 以支持具有这些属性的 Op 'VarHandleOp'。注册设备:[CPU],注册内核:
- java - 将值列表添加到 jpa 规范
- powerbi - 如何在 DAX 中的列之间找到两个级别之间的差异
- indexing - 在不更新正在使用的 solr 索引的情况下获取 solr 索引响应
- reactjs - React App 作为 IIS 中的应用程序不起作用
- c# - 如何 ThreadStart 一个标记为异步的方法?
- java - Android - 片段启动但不显示内容