我有一个包含信息的文件。 每个信息部分都位于一定的偏移量。大约有100个部分的信息。每个信息部分都从“LPS”一词的开头开始 在文件的开头有一个列表的偏移地址,指向每个信息部分。
例如:
“ 801F 0B00 ”链接到偏移量“ B1F80 ”,其中新的信息部分开始 “ 80B0 0B00 ”是指偏差“ BB080 ”,其中新的信息部分开始
我正在添加/缩短这些行的信息,所以我需要更改文件开头(列表)的偏移量,使它们与新位置重合。
那么,什么代码可以帮助我自动执行此操作? 例如,该工具必须识别偏移地址(列表) 请允许我添加新信息 然后,使用新位置修改偏移列表。
谢谢
答案 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
}
祝你好运!