【发布时间】:2020-06-05 18:56:59
【问题描述】:
我正在解析一个我知道格式的自定义二进制文件结构。
一般的想法是,每个文件都被分解成连续字节块,我想将它们分开并并行解码。
我正在寻找decode_block() 的可读、高性能替代品
这是我目前正在使用的:
#include <stdio.h>
int decode_block(uint8_t buffer[]);
int main(){
FILE *ptr;
ptr = fopen("example_file.bin", "rb");
if (!ptr){
printf("can't open.\n");
return 1;
}
int block1_size = 2404;
uint8_t block1_buffer[block1_size];
fread(block1_buffer, sizeof(char), block1_size, ptr);
int block2_size = 3422;
uint8_t block2_buffer[block2_size];
fread(block2_buffer, sizeof(char), block2_size, ptr);
fclose(ptr);
//Do these in parallel
decode_block(block1_buffer);
decode_block(block2_buffer);
return 0;
}
int decode_block(uint8_t buffer[]){
unsigned int size_of_block = (buffer[3] << 24) + (buffer[2] << 16) + (buffer[1] << 8) + buffer[0];
unsigned int format_version = buffer[4];
unsigned int number_of_values = (buffer[8] << 24) + (buffer[7] << 16) + (buffer[6] << 8) + buffer[5];
unsigned int first_value = (buffer[10] << 8) + buffer[9];
// On and on and on
int ptr = first_value
int values[number_of_values];
for(int i = 0; i < number_of_values; i++){
values[i] = (buffer[ptr + 3] << 24) + (buffer[ptr + 2] << 16) + (buffer[ptr + 1] << 8) + buffer[ptr];
ptr += 4
}
// On and on and on
return 0
}
将整个文件读入字节数组,然后逐字节解释数组,感觉有点多余。此外,它还会产生非常庞大的代码。
但由于我需要并行操作文件的多个部分,我想不出另一种方法来做到这一点。此外,是否有更简单或更快的方法将buffer 中的早期字节转换为其受尊重的元数据值?
【问题讨论】:
-
你知道文件中的块边界在哪里,而不必扫描它吗?
-
打开文件两次 - 2 个文件指针。让 1 个线程从头开始读取/解码,另一个线程在中间开始读取/解码。请参阅:fseek。
-
@jwdonahue 是的,我提前知道了区块边界。
-
@Johnny Mopp 使用两个不同的指针同时读取同一个文件的文件权限没有问题吗?