C I';我试图在一行上打印16个十六进制值

C I';我试图在一行上打印16个十六进制值,c,C,我有一个程序,它接收命令行参数和elf文件的路径,并使用结构显示它们的内容。elf头文件设置为有16个字节。在这些字节中,每两个字节描述有关头的其他内容(版本、入口点等),最后四个字节包含一个神奇的数字,告诉您它是文件的结尾。字节都是十六进制的 bool read_header (FILE *file, elf_hdr_t *hdr) { if (hdr != NULL && file != NULL && fread(hdr, sizeof(*hdr),

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

bool read_header (FILE *file, elf_hdr_t *hdr)
{
    if (hdr != NULL && file != NULL && fread(hdr, sizeof(*hdr), 1, file) == 1)
    {
      fread(hdr, sizeof(*hdr), 1, file);
      if (hdr->magic == 0x00464C45)
      {
        return true;
      }
    }
    return false;
}
我应该在同一行上以%x十六进制格式打印结构的每一位

这是我将值存储到的结构

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;
有人告诉我可以使用for循环,但我不知道如何使用。 你建议我怎么做

我需要使用以下方法

void dump_header (elf_hdr_t hdr)
{

}
我应该在同一行上以%x十六进制格式打印结构的每一位

在读取一次标题之后

。。。打印其内容。将
hdr
地址强制转换为
无符号字符*

void dump_header(elf_hdr_t hdr) {
  bool success = read_header(file, &hdr);
  printf("Success %d\n", success);
  for (size+t i = 0; i < sizeof hdr; i++) {
    printf("%x ", ((unsigned char *)&hdr)[i]);
  }
  printf("\n");
}
void dump_头(elf_hdr_t hdr){
bool success=read_头(文件和hdr);
printf(“成功%d\n”,成功);
对于(大小+ti=0;i


传入
elf_hdr_t*
是更常见的C方法。

char
数组进行并集,然后迭代并逐个打印
无符号char缓冲区[sizeof(elf_hdr_t)];const char*pad=“”;memmove(缓冲区、hdr、sizeof(缓冲区));对于(inti=0;i您调用了
fread
两次,因此
hdr
结构包含文件中的第二个16字节。这是您想要的吗?请尝试:
无效转储头(elf\u hdr\t hdr){unsigned char*buf=(char*)&hdr;for(int-idx=0;idx
旁注:您确定参数是
elf_hdr_t hdr
而不是
elf_hdr_t*hdr
?请原谅我的天真,但为什么简单的
printf(“%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%04X\n”,hdr.e_版本,hdr.e_条目,hdr.e_phdr_开始,hdr.e_num_phdr,hdr.e_符号表,hdr.e_strtab,hdr.magic);
可以吗?
void dump_header(elf_hdr_t hdr) {
  bool success = read_header(file, &hdr);
  printf("Success %d\n", success);
  for (size+t i = 0; i < sizeof hdr; i++) {
    printf("%x ", ((unsigned char *)&hdr)[i]);
  }
  printf("\n");
}