如何修改十六进制地址ip?

时间:2019-01-10 16:37:45

标签: c

我正在使用网络模拟器显示某些网络节点的地址ip,但是我没有得到预期的结果。

我使用此功能显示IP地址:

void print_hex_src_adress(uint8_t *s, size_t len)
{
    printf("  ID=");
    for(int i=0; i< len; i++) {
        printf("%02x", s[i]);
    }
}

然后为了显示我放置的地址:

open_addr_t * myaddress;
myaddress = idmanager_getMyID(ADDR_64B);
print_hex_src_adress(myadress, 16);

但是我得到的结果不是预期的结果:

  ID=02141592cc0000000400000093947ae2

预期结果是:

  ID=02141592cc0000000400000000000000

1 个答案:

答案 0 :(得分:1)

idmanager_getMyID返回一个指向open_addr_t类型的并集的指针。联合是一个足以容纳其可能包含的任何字段的对象。这并不意味着其中的所有数据都会被初始化。您正在请求ADDR_64B,这意味着仅可能通过addr_64b字段初始化联合的前64位或8个字节。

实际上发生的是,您正在调用未定义的行为,试图打印包含垃圾值的字节。好消息是您将不会遇到不允许使用的内存,因为联合至少为16个字节。您期望垃圾为零,但实际上是获取垃圾。您有两种选择:

  1. 打印您实际请求的字节:

    print_hex_src_adress(myadress.addr_64b, sizeof(myadress.addr_64b));
    

    使用sizeof这样的习惯是一个好习惯。结构和联合可以在版本之间进行更改,但是这样编写可以使您的代码模式对这种更改具有鲁棒性。

  2. 请求您实际想要的字节:

    myaddress = idmanager_getMyID(ADDR_128B);
    

    打印时仍请参考正确的字段,并且不要过多地硬编码尺寸:

    print_hex_src_adress(myadress.addr_128b, sizeof(myadress.addr_128b));