从 C 中的 header 文件中读取十六进制字节
Read hex bytes from header file in C
我有一个程序接受命令行参数和 elf 文件的路径,并使用 struct
显示它们的内容。 elf header 文件被设置为有 16 个字节。在这些字节中,每两个字节描述有关 header 的其他信息(版本、入口点等),最后四个字节包含一个幻数,告诉您它是文件的末尾。字节都是十六进制的。
Header 文件:
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();
根据打包问题、文件打开模式和 endianness,代码可能能够用 1 fread()
.
读取整个 header
size_t cnt = fread(hdr, sizeof *hdr, 1, file);
if (cnt != 1) Handle_Failure();
我有一个程序接受命令行参数和 elf 文件的路径,并使用 struct
显示它们的内容。 elf header 文件被设置为有 16 个字节。在这些字节中,每两个字节描述有关 header 的其他信息(版本、入口点等),最后四个字节包含一个幻数,告诉您它是文件的末尾。字节都是十六进制的。
Header 文件:
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();
根据打包问题、文件打开模式和 endianness,代码可能能够用 1 fread()
.
size_t cnt = fread(hdr, sizeof *hdr, 1, file);
if (cnt != 1) Handle_Failure();