C I';我试图在一行上打印16个十六进制值
我有一个程序,它接收命令行参数和elf文件的路径,并使用结构显示它们的内容。elf头文件设置为有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),
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");
}