繁体   English   中英

从 C 中的头文件中读取十六进制字节

[英]Read hex bytes from header file in C

我有一个程序,它接受命令行参数和一个 elf 文件的路径,并使用struct显示它们的内容。 elf 头文件设置为 16 个字节。 在这些字节中,每两个字节描述有关标题的其他内容(版本、入口点等),最后四个字节包含一个幻数,告诉您这是文件的结尾。 字节都是十六进制的。

头文件:

bool read_header (FILE *file, elf_hdr_t *hdr)
{
  if(!file){
    return false;   
  }
  fseek(file,0,SEEK_END);
  long lsize=0,i=0;
  lsize = ftell(file);
  rewind(file);

  while(i<8){
    (*hdr).e_version = fgetc(file) +fgetc(file);
    i++;
  }
  fclose(file);
  return true;
}

这里是struct ,我存储值代入。

typedef struct __attribute__((__packed__)) elf {
    uint16_t e_version;     /* version should be 1 */
    uint16_t e_entry;       /* entry point of program */
    uint16_t e_phdr_start;  /* start of program headers */
    uint16_t e_num_phdr;    /* number of program headers */
    uint16_t e_symtab;      /* start of symbol table */
    uint16_t e_strtab;      /* start of string table */
    uint32_t magic;         /* ELF */
} elf_hdr_t;

显然我没有存储所有数据,但是我不知道应该如何存储手头的数据。

假设匹配的字节序,使用fread()而不是fgetc()读取int16_t

size_t cnt = fread(&((*hdr).e_version), sizeof ((*hdr).e_version), 1, file);
if (cnt != 1) Handle_Failure();

根据打包问题、文件打开模式和字节顺序,代码可能能够使用 1 fread()读取整个标头。

size_t cnt = fread(hdr, sizeof *hdr, 1, file);
if (cnt != 1) Handle_Failure();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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