gpt4 book ai didi

c - C 中的 Hexdump 文本和二进制文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:49 26 4
gpt4 key购买 nike

我正在用 C 编写代码,在文本和二进制文件中执行 hexdump。我在文本文件中的输出是正确的,但是当我尝试在二进制文件中执行 hexdump 时,我得到了垃圾。如果我的代码哪一部分错误,我应该如何纠正我的错误,我想请求你的帮助。谢谢。

#include <stdio.h>
#define OFFSET 16

main(int argc, char const *argv[])
{
FILE *fp;
char buff[OFFSET];
int read;
int address = 0;
int i;

if (argc != 2){
exit(0);
}

fp = fopen(argv[1], "rb");

while ((read = fread(buff, 1, sizeof buff, fp)) > 0){
printf("%08x ", address);
address += OFFSET;

//print hex values
for (i = 0; i < OFFSET; i++){

if(i >= read){
buff[i] = 0;
}
if(buff[i] >= 33 && buff[i] <= 255 || buff[i] != 00){
printf("%02x ", buff[i]);
}
if(buff[i] == 00){
printf(" ");
}
}

//print ascii values
for (i = 0; i < OFFSET; i++) {
printf("%c", (buff[i] >= 33 && buff[i] <= 255 ? buff[i] : ' '));
}
printf("\n");
}

fclose(fp);
}

最佳答案

你在逻辑上有几个错误。首先如评论中所述,所有字符在二进制文件中都同等重要。没有必要(也不应该)测试 if(buff[i] >= 33 && buff[i] <= 255 || buff[i] != 00)用于您的二进制输出。

main 的正确声明是int main (void)int main (int argc, char **argv) (你会看到用等效的 char *argv[] 写的)。请参阅:C11 Standard §5.1.2.2.1 Program startup p1 (draft n1570) .另请参阅:See What should main() return in C and C++?

接下来你的二进制输出,你试图用%02x打印一个unsigned值。 ,但您传递的是一个签名字符。如果char值为负数,您正尝试输出 符号扩展 值并输出无符号值的全宽(02x 会将字段填充为 2 个字符,但不会阻止超过两个字符从打印)。您有几个选择,首先使用 hh长度修饰符将类型限制为 1 字节,然后简单地将值转换为 (unsigned char) ,例如

            printf("%02hhx ", (unsigned char)buff[i]);

你的逻辑也有点繁琐。你应该使用 if ... else if ... else处理您的二进制案例。此外,您在 i >= read || buff[i] == 0 时输出两个空格。 ,所以你不妨结合测试。

简短的重写可能类似于以下内容(它将从作为第一个参数给出的文件中读取——如果没有给出参数,则从 stdin 中读取)

#include <stdio.h>

#define OFFSET 16

int main (int argc, char const *argv[])
{
char buff[OFFSET] = "";
int read, address = 0, i;
FILE *fp = argc > 1 ? fopen (argv[1], "rb") : stdin;

if (!fp) {
perror ("fopen");
return 1;
}

while ((read = fread(buff, 1, sizeof buff, fp)) > 0) {
printf("%08x ", address);
address += OFFSET;

for (i = 0; i < OFFSET; i++) /* print hex values */
if (i >= read || buff[i] == 0)
printf(" ");
else
printf("%02hhx ", (unsigned char)buff[i]);

fputs ("| ", stdout); /* optional separator before ASCII */

for (i = 0; i < OFFSET; i++) /* print ascii values */
printf("%c", (buff[i] >= ' ' && buff[i] <= '~' ? buff[i] : ' '));
putchar ('\n'); /* use putchar to output single character */
}

if (fp != stdin)
fclose (fp);
}

(注意:如果您的编译器不支持 hh 前缀,转换本身就足够了)

检查一下,如果您还有其他问题,请告诉我。

关于c - C 中的 Hexdump 文本和二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51914137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com