在C中显示原始值的字节表示

时间:2015-04-16 12:39:50

标签: c

学习C,现在我学习简单的代码片段,显示原始值的字节表示:

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len) {
    int i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
}

void show_float(float x) {
    show_bytes((byte_pointer) &x, sizeof(float));
}

void show_int(int x) {
    show_bytes((byte_pointer) &x, sizeof(int));
}

void show_pointer(void *x) {
    show_bytes((byte_pointer) &x, sizeof(void *));
}

如果我理解正确,&x(一个&符号)显示内存地址(等于*x)。

因此。程序例程显示每种数据类型的十六进制值,int字节值如(sizeof(int))

我真的不明白它的工作原理。首先,我们typedef指向unsigned char,然后将其与其他类型一起使用。当我们将byte_pointer定义为类型(byte_pointer) &x的值时,unsigned char的含义是什么?为什么它可以工作?我知道我们获取包含值的内存地址,但我不知道它是如何工作的以及为什么它与char指针一起工作。你能解释那个部分吗?

感谢。

2 个答案:

答案 0 :(得分:1)

byte_pointer被定义为unsigned char指针;这是show_bytes可以打印出传递给show_bytes的地址的每个字节(十六进制)。

我会声明startvoid*,然后将其投放到show_bytes内,使其更清晰show_bytes无关心start指向什么类型的事物,以及b)避免每次通话中的演员。

答案 1 :(得分:1)

代码简单地获取随机数据块的地址并逐字节地打印内容。代码获取传递给它的任何地址,然后将其转换为指向字节的指针(unsigned char)。 C中的任何指针类型都可以转换为另一种指针类型,尽管在某些情况下这样做是危险的做法。在char的情况下,它是安全的,但您可以保证获得指向对象的最低寻址字节的指针。

请注意,将指针隐藏在typedef后面是一种糟糕且危险的做法。忘记那个typedef,它没有增加任何价值。编写相同代码的更好方法是:

void show_bytes (const uint8_t* start, int len)

或者

void show_bytes (const void* s, int len)
{
  const uint8_t* start = s;
  ...