【问题标题】:Read len bytes of a file at offset and write it to FILETIME [closed]在偏移量处读取文件的 len 个字节并将其写入 FILETIME [关闭]
【发布时间】:2021-06-24 06:24:15
【问题描述】:

当只知道应该为红色的元素的大小和偏移量(以十六进制表示)时,是否有可能从二进制文件中读取某物?

例如,如果我想读取一个 8 字节的 FILETIME 变量,它的偏移量为 0x001C,我该如何处理这是 C 或 C++?

我试过了

fseek(pFile, 0x001C, SEEK_SET);
FILETIME* temp =(FILETIME*) malloc(sizeof(FILETIME));
fscanf(pFile, "%d", *temp);

但它不能正常工作,我不知道为什么。

谢谢

【问题讨论】:

  • “它不能正常工作”不是一个有用的问题描述。
  • 您不能将fscanf 与二进制文件一起使用。或者,你可以,但它没有意义。
  • 在读操作时,元素的大小在哪里使用?
  • 注:二进制搜索不是你想的那样,它是一种在 O(log(n)) 中搜索排序数组中的值的算法,我从标签中删除了它。如果您想了解更多信息:en.wikipedia.org/wiki/Binary_search_algorithm

标签: c++ c binary sequential fseek


【解决方案1】:

您可以使用 fseek 设置偏移量,然后使用 fread 读取 len 个字节:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *file = fopen("read_bytes.c", "rb");
    size_t offset = 0x001C;
    size_t len = 8;

    fseek(file, offset, SEEK_SET);
    FILETIME* temp = malloc(sizeof(FILETIME));
    fread(temp, 1, len, file);
}

【讨论】:

  • 如果变量中已经有了长度,为什么还要用硬编码的长度来 memcpy?为什么要在缓冲区中读取,然后使用 memcpy 而不是直接读取?
  • 我没有 FILETIME 标头,是为了测试它,我编辑删除 memcpy 并坚持 OP 的问题
  • FILETIME是二进制结构,所以不能用%s打印。
  • 谢谢!似乎问题在于我使用的是 fscanf 而不是 fread。非常感谢
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多