Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中读取对象文件?_C_Fgetc - Fatal编程技术网

如何在C中读取对象文件?

如何在C中读取对象文件?,c,fgetc,C,Fgetc,假设有一个对象文件input.obj。在终端中,如果我执行“cat input.obj”,它会返回一些随机字符,如“?”A?J”。但当我“hextump”它时,它会显示我想读入程序的值 我将这个obj文件读入program.c,首先使用fopen打开它,然后使用fgetc逐字节读取。然而,它实际上读取的内容如“cat input.obj”所示,而我希望它读取的实际内容如hextump所示。有什么想法吗 代码片段(来自海报注释): 本质上,您需要打印每个字节的整数表示,以获得所需内容,而不是字节本

假设有一个对象文件input.obj。在终端中,如果我执行“cat input.obj”,它会返回一些随机字符,如“?”A?J”。但当我“hextump”它时,它会显示我想读入程序的值

我将这个obj文件读入program.c,首先使用fopen打开它,然后使用fgetc逐字节读取。然而,它实际上读取的内容如“cat input.obj”所示,而我希望它读取的实际内容如hextump所示。有什么想法吗

代码片段(来自海报注释):


本质上,您需要打印每个字节的整数表示,以获得所需内容,而不是字节本身。试试这个:

char ch = ...; // Set ch to the value you read from the file
printf("%x", ch & 0xff);

&0xFF确保将值打印为1字节。

这也是我所面临的问题。 令人惊讶的是,fopen和fgetc不会得到整个文本文件,并且在不解析整个对象文件的情况下会到达EOF

改用open()和read()系统调用。您可以使用手册页检查它们的语法

它们会为您提供整个对象文件,正如您所看到的那样


$hextump-C 1_hello.o

向我们展示
fopen()
语句,因为有一些标志指定要打开的文件是二进制文件还是文本文件,如果不使用正确的模式,可能会破坏流中的内容。基本上,请提供代码。您需要使用二进制输入;或者是
getc()
或者
fread()
或者是他们的一个亲戚。您需要了解要模拟的文件结构
hextump
。这涉及到理解Linux上的ELF格式,以及其他机器上的不同对象文件格式。您需要在感兴趣的不同机器上查找对象文件读取库。@JonathanLeffler我认为这些“对象文件”与已编译的elf文件无关。更有可能的是,它们只是二进制文件,OP碰巧调用对象(如果我错了,请纠正我,OP)。@Chris:你可能是对的,不过
input.obj
可能是Windows对象文件。更严重的是,
hextump
可能不会将对象文件解释为对象文件,而是将其解释为简单的二进制文件,对于这些文件,
fgetc()
只要以二进制模式打开文件就可以了(这在Windows上很重要;当然在Unix上不重要)。我想用
objdump
代替
hextump
,原因不太清楚。既然
char
在C中总是一个字节,为什么要屏蔽它?@AlexReynolds:
char
在通过varargs时被提升为
int
。另外,默认情况下,
char
通常是
signed
char ch = ...; // Set ch to the value you read from the file
printf("%x", ch & 0xff);