[英]How can I read a var from a binary file from different parts? (Say, 2 bytes, and another 2 bytes from another place?)
是否可以从二进制文件的多个部分读取数据?
例如,一个整数; sizeof(int)= 4; 我想从文件上的某个位置读取前n个字节,并从另一个位置读取其他4-n个字节; 然后以某种方式将它们组合成一个完整的4字节整数。
这可能吗?
是的,这是可能的,并且可以通过非常便携的方式(*)完成 :
union int_bytes
{
uint32_t value;
unsigned char bytes[4];
};
long int first_part_offset = ... ;
long int second_part_offset = ... ;
size_t first_part_size = ... ;
FILE* file = fopen("filename", "rb");
int_bytes result;
fseek(file, first_part_offset, SEEK_SET);
fread(&(result.bytes[0]), 1, first_part_size, file);
if(first_part_size < 4) // nothing to read if first part was 4-byte long...
{
fseek(file, second_part_offset, SEEK_SET);
fread(&(result.bytes[first_part_size]), 1, first_part_size, file);
}
uint32_t final_int_value = int_bytes.value;
(*)在这里可以做哪些非便携式的? 请记住,序列化数据始终取决于当前体系结构的字节顺序(字节序) 。
如果您编写此代码:
int value = ... ;
fwrite(&value, sizeof(int), 1, file_handle);
文件内容将取决于字节顺序。 是的,如今大多数平台都是低端的,但并非全部! 如果您知道某些二进制数据已序列化为big-endian,而当前的硬件是little-endian(反之亦然),则将需要交换读取字节(大多数编译器允许有效地执行此操作,但是,提供内在的,直接映射到BSWAP
指令 )。
在许多字节操作中,联合是您最好的朋友,因为它们至少具有最小的可移植性。
显然,这是可能的,并且可以通过许多不同的方式来完成。
您可以分两步将数据(使用fread()
或read()
或所需的任何东西fread()
read()
入4个char
的数组中。 然后,您可以将memcpy()
为int
。 如果您不担心强制转换和指针运算,可以跳过使用char array[4]
和memcpy()
。
您始终可以将它们读入两个变量并计算结果。 我认为将它们读入一个变量不是非常有用或不实用。 如果两个部分足够接近,则可以将它们读入一个缓冲区结构中以避免两次读取。
我会通过以下方式:
std::ifstream fstr("file", std::ios_base::binary);
int value;
fstr.read(reinterpret_cast<char*>(&value), 2); //first two bytes
//read other stuff
fstr.read(reinterpret_cast<char*>(&value)+2, 2); //second two bytes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.