首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python C++取回char*缺少linux上的最后一个字符

python C++取回char*缺少linux上的最后一个字符
EN

Stack Overflow用户
提问于 2017-04-28 15:34:18
回答 1查看 209关注 0票数 1

我有以下C++代码:

代码语言:javascript
运行
复制
__declspec(dllimport) char* get_mac()
{
    size_t byteToAlloc = 17;
    char *mac_addr = (char*) malloc(byteToAlloc);
    struct ifreq buffer;
    int s = socket(PF_INET, SOCK_DGRAM, 0);
    strcpy(buffer.ifr_name,"enp0s3");
    if (0 == ioctl(s, SIOCGIFHWADDR, &buffer))
    {
        // Save Mac Address in hex format
        snprintf(mac_addr, byteToAlloc, "%02X:%02X:%02X:%02X:%02X:%02X",
                    (unsigned char) buffer.ifr_hwaddr.sa_data[0],
                    (unsigned char) buffer.ifr_hwaddr.sa_data[1],
                    (unsigned char) buffer.ifr_hwaddr.sa_data[2],
                    (unsigned char) buffer.ifr_hwaddr.sa_data[3],
                    (unsigned char) buffer.ifr_hwaddr.sa_data[4],
                    (unsigned char) buffer.ifr_hwaddr.sa_data[5]);
    }
    close(s);
    return mac_addr;
}

它使用ifreq获取本地PC的mac地址,并将其粘贴到一个字符数组中。该例程在"Utility.so“中编译。

然后我有以下python代码:

代码语言:javascript
运行
复制
from ctypes import *
mydll=cdll.LoadLibrary("./Utility.so")
mac_string = c_char_p(mydll.get_mac()).value
print mac_string

我得到的结果是02:00:AC:99:00:9

当我的MAC实际上是: 02:00:AC:99:00:9C

所以我错过了最后一次。

知道吗?

注意:它在Mac和Windows上都很好!

帮帮忙,-你好cp

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-28 15:42:29

在C/C++中,c-字符串以空结尾,这意味着结束被标记为NULL (字节0).

要存储17个字符的文本(MAC的长度),数组需要18个字符,才能解释最后的NULL。

snprintf (http://www.cplusplus.com/reference/cstdio/snprintf/)将确保它可以写空,所以它只写16个字节的MAC,然后是尾空。

简言之:

代码语言:javascript
运行
复制
size_t byteToAlloc = 18;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43683939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档