繁体   English   中英

如何从不同部分的二进制文件读取var? (说2个字节,再从另一个地方再发送2个字节?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM