0

我有一个包含信息的文件。每个信息部分都位于某个偏移量处。大约有100个信息部分。每个信息部分都从单词“LPS”的开头开始 在文件的开头有一个指向每个信息部分的偏移地址列表。

例如:

801F 0B00 ”链接到新信息段开始的偏移量“ B1F80 ” “ 80B0 0B00 ”指的是新信息段开始的偏移量“ BB080

我正在添加/缩短这些行的信息,因此我需要更改文件(列表)开头的偏移量,以使它们与新位置一致。

那么,究竟什么代码可以帮助我自动执行此操作?例如,工具必须识别偏移地址(列表) 允许我添加新信息 然后,用新位置修改偏移列表。

谢谢

4

2 回答 2

0

每个偏移量都是指向该位置的字节反转十六进制指针。所以你需要将指针转换为整数。

您并不清楚您要问什么,但假设您有一个文件,其中包含以下内容:

offset0A offset0B offset0C offset0D 数据

您应该将所有偏移量读入一个整数数组,每个整数都是一个偏移量的值。

然后将剩下的数据读入一个大块。记住数据块的基本偏移量是多少。

然后开始更新您的数据。每次将字节插入数据块时,都需要根据插入的字节数更新从插入点开始的所有指针。

因此,如果您有:

1000 0000 2000 0000 3000 0000 数据

假设您在偏移量 2400 处插入“sometext”。然后您可以遍历偏移量列表。1000 < 2400,所以你不要碰那个,或者 2000 的那个。但是 3000 >= 2400 所以你需要把这个偏移量改成 3008。

继续为所有插入执行此操作。完成后,先写出一组偏移量,然后再写出数据。

于 2013-08-20T00:24:10.343 回答
0

假设文件有 100 个偏移量和字符串。一旦你看到它是如何工作的,你就可以将 100 更改为可变的。

要读取文件,请执行此操作

#define N 100
typedef int OFFSET;  // assume int is 4 btyes and big enough to hold a file offset
OFFSET offset[ N ];
// offset[N-1] is 1 past the end of the last data string
// read the N offsets from file into offset[]

std::string data[ N ];
for( int i = 0; i < N-1; i++ ) {
    size_t len = offset[i+1] - offset[i] - 1;
    // read 'len' bytes at offset[i] into data[i]
}

现在您对 data[] 中的字符串进行了更改并想要重写文件。要写入新文件,请执行此操作

offset[0] = sizeof(offset);   // start of data in the file
for( int i = 1; i < N; i++ ) {
    offset[i] = offset[i-1] + data[i-1].size();
}
// Write the offset[] array to the file

for( int i = 0; i < N-1; i++ ) {
    // write data[i] at offset[i] in the file
}

祝你好运!

于 2013-08-20T02:05:08.837 回答