1

我正在读取两个 32 位寄存器并尝试使用以下命令将其放入字符串缓冲区中:

sprintf (buffer, "%s-%s", ((char*)(in32(REGISTER1))) , (char*)(in32(REGISTER2)));

从寄存器中读取的十六进制值是否可以不作为指向 char 的指针进行类型转换并如上所述打印到缓冲区中?

4

3 回答 3

3

正如craig65535在上面的评论中暗示的那样,问题很可能出在这句话上:

从寄存器中读取的十六进制值

我怀疑您正在阅读十六进制值;相反,您正在阅读整数。如果您想将该整数的十六进制表示形式存储字符串中,您可以使用%X格式说明符:

sprintf (buffer, "%08X-%08X", in32(REGISTER1), in32(REGISTER2));

8意思是“使用八个字符的宽度”;0意思是“如果值是宽度小于八个,则左填充零”。)

您可以有效转换为的唯一方法char *是,如果寄存器中的整数值实际上是指向您存储字符串的某个内存位置的指针;但这显然不是这里的情况。

于 2012-09-14T19:59:04.380 回答
2

sprintf(buffer, "%08x-%08x", REGISTER1, REGISTER2); - 这是假设您想要缓冲区中的寄存器地址。如果您打算读取寄存器的内容,请进行相应调整。关键是您不能简单地将数字称为 char* 并从中获取数字,但是sprintf()(以及所有类似 printf 的函数)可以为您转换值基数。

于 2012-09-14T19:58:15.617 回答
0

正如其他答案所暗示的那样,您可以sprintf使用 using将整数转换为字符串十六进制表示%X
但是由于您没有说您使用什么编译器或整数或长整数的长度是多少,您可能会得到意想不到的结果。
在 16 位控制器sprintf (buffer, "%08X-%08X", in32(REGISTER1),in32(REGISTER2));上会失败。

这应该适用于大多数平台,因为 sprintf 假定 long 值作为参数,并且参数总是转换为 long。

sprintf (buffer, "%08lX-%08lX", (long)in32(REGISTER1), (long)in32(REGISTER2));
于 2012-09-16T12:21:55.570 回答