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

时间:2017-01-30 16:25:01

标签: c struct hex header-files

我有一个程序,它接受命令行参数和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;

显然我并没有存储所有数据,但我对如何存储手头的数据感到很遗憾。

1 个答案:

答案 0 :(得分:1)

假设匹配的字节序,请使用public class FeedRootRecyclerView extends BetterRecyclerView{ public FeedRootRecyclerView(Context context) { this(context, null); } public FeedRootRecyclerView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public FeedRootRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { /* do nothing */ } } 而不是int16_t阅读fread()

fgetc()

根据打包问题,文件打开模式和endianness,代码可能会以1 size_t cnt = fread(&((*hdr).e_version), sizeof ((*hdr).e_version), 1, file); if (cnt != 1) Handle_Failure(); 读取整个标头。

fread()