c - 奇怪的 printf() 行为

标签 c linux sockets

我在这个问题中附加的代码应该获取设备的 mac 地址并打印它。当我将数据从 struct ifreq 复制到 uint8_t 数组时它起作用,但当我不这样做时,我得到奇怪的结果。查看输出的第二行和第二个字节。

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <net/ethernet.h>
#include <sys/types.h>
#include <stdint.h>

int main()
{
    uint8_t tab[6];
    int i;
    struct ifreq one;
    int sd = socket(AF_PACKET, SOCK_RAW, 0);

    memset(&one, 0, sizeof(struct ifreq));

    strcpy(one.ifr_name, "eth0");

    int v = ioctl(sd, SIOCGIFHWADDR, &one);    

    memcpy(tab, one.ifr_hwaddr.sa_data, sizeof(uint8_t) * 6);
    for(i=0;i<6;i++)
        printf("%02x:", tab[i]);
    printf("\n");

    for(i=0;i<6;i++)
        printf("%02x:", one.ifr_hwaddr.sa_data[i]);
    printf("\n");
}

输出:

74:86:7a:0a:2c:6d:

74:ffffff86:7a:0a:2c:6d:

最佳答案

您是在问为什么第二个字节打印为 ffffff86 而不是 86?这是因为它被符号扩展了。 one.ifr_hwaddr.sa_data[i] 数组声明为带符号的字符数组,但您的 tab[] 数组是无符号的。

printf 的参数都被提升为 int。无符号字符 0x86 被提升为 0x00000086,但当相同的值被假定为有符号时,它被提升为 0xFFFFFF86。

关于c - 奇怪的 printf() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22694762/

相关文章:

perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞

Java套接字编程: Is it possible for the server socket to initiate a communication?

linux - Bash 概念性问题

c - 用于无括号、空格敏感的 C 语法的工具

java - 适用于任何语言的不同 gearman 库

无法创建整数数组来保存字符

c - 初学 C 程序员在使用字符串函数时遇到问题

javascript - 如何在 openSUSE 上使用 NGINX 或 Apache2 将端口 80 重新路由到 localhost :3000 so I can run my Node. js 应用程序

java - Android Socket 编程 Socket 从不连接

c - 如何提供 OpenSSL 随机数据以用于 ECDSA 签名?