3

所以我正在编写一个非常小而简单的程序,它将一个数字作为输入,将其转换为十六进制,并一次打印出两个字符。

对于某些数字,它会在输出前打印出 ffffff。

这是我的代码:

    //Convert the input to an unsigned int
unsigned int a = strtoul (argv[1], NULL, 0);
//Convert the unsigned int to a char pointer
char* c = (char*) &a;

//Print out the char two at a time
for(int i = 0; i < 4; i++){
    printf("%02x ", c[i]);
}

大部分输出都很好,如下所示:

./hex_int 1

01 00 00 00

但对于某些数字,输出如下所示:

./hex_int 100000

ffffffa0 ffffff86 01 00

如果您删除所有 f,则转换是正确的,但我无法弄清楚为什么它仅在某些输入上执行此操作。

有人有想法么?

4

4 回答 4

5

您的参数和打印格式不匹配。默认参数提升会导致您的char参数 ( c[i]) 提升为int,符号扩展(显然您char是有符号类型)。然后你告诉使用格式printf来解释这个论点。繁荣 - 未定义的行为。unsigned int%x

利用:

printf("%02x ", (unsigned int)(unsigned char)c[i]);

反而。

于 2013-08-28T20:46:33.823 回答
0

char默认情况下,在您的系统上签名。将 int 移入其中会使您的编译器认为您想在需要转换为 int 的操作上使用最高位作为符号位。并将其打印为十六进制数字是一。

将 char 指针设为can unsigned char *,问题就会消失。

如果卡尔的评论是正确的(我要检查一下),请改用这种故障安全方法:

printf("%02x ", c[i] & 0xff);
于 2013-08-28T20:49:56.330 回答
-1

我做了一段时间,我意识到,你可以在一个进程中看到 exe 映像,使用调试器,代码没问题,但我暂时不能将这个机器代码传递给汇编器,但是,用指针一切皆有可能

include stdio.h

include windows.h

int main ()

{

int i=0;

char * p = (char *)0x400000;

for(int i = 0; i < 20; i++)

{

    printf("%p %02x \n",p+i, (unsigned int)(unsigned char)*(p+i));
}

}
于 2016-07-05T05:37:01.803 回答
-2

嗯,windows.h是为了使用一些系统调用,我在例子中省略了,因为在下面的代码中不需要使用那些,关于无符号的,是的,可以省略,因为char总是> 0,关于地址,如你之前所说,0400000是exe的头,在这种情况下是“mz”头,但是进程的dll的代码可以是7c911000,而dll的头是另一个地址,依此类推。 .,此信息在 exe 文件中,必须阅读以了解加载的图像在主内存中的加载位置,但是当您只有一个进程时,是否还有更多进程,您必须使用系统调用来知道在哪里第二个过程,如果一个地址不可读,只需在记事本中读取de exe,该地址只是一个示例

于 2016-07-05T20:51:51.537 回答