如何快速重新定位偏移地址?

时间:2013-08-19 22:36:35

标签: javascript c++ python pointers hex

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

例如:

801F 0B00 ”链接到偏移量“ B1F80 ”,其中新的信息部分开始 “ 80B0 0B00 ”是指偏差“ BB080 ”,其中新的信息部分开始

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

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

谢谢

2 个答案:

答案 0 :(得分:0)

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

你并不是很清楚你在问什么,但假设你有一个类似的文件:

offset0A offset0B offset0C offset0D 数据

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

然后将其余数据读入一个大块。记住数据块的基本偏移量是什么。

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

所以如果你有:

1000 0000 2000 0000 3000 0000 数据

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

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

答案 1 :(得分: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
}
祝你好运!