将多个无符号Char数据从一个函数返回到另一个函数

时间:2018-10-22 08:28:16

标签: c

我试图将无符号字符从一个函数返回到另一个函数,但由于我不熟悉C并且它的数据结构对我来说仍然是一个谜。这是正在调用该函数的函数。...

void print_ethernet_data(const u_char * Buffer, int Size)
{
    unsigned char destination, src;
    unsigned short qtype;
    get_ethernet_header(Buffer , Size, &destination, &src, &qtype); //The function that is supposed to return the values
    printf("|-Dest : %u \n", destination);
    printf("|-Protocol            : %u \n",qtype);
}

这是函数get_internet_header的描述:

void get_ethernet_header(const u_char *Buffer, int Size, unsigned char* destination, unsigned char* src, unsigned short* qtype)
{
    struct ether_header *eth = (struct ether_header *)Buffer;

    printf( "\n");
    printf( "Ethernet Header\n");
    printf( "   |-Destination Address : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->dhost[0] , eth->dhost[1] , eth->dhost[2] , eth->dhost[3] , eth->dhost[4] , eth->dhost[5] );
    printf( "   |-Source Address      : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X \n", eth->shost[0] , eth->shost[1] , eth->shost[2] , eth->shost[3] , eth->shost[4] , eth->shost[5] );
    printf( "   |-Protocol            : %u \n",(unsigned short)eth->type);
    *destination = eth->dhost;
    *src = eth->shost;
    *qtype = (unsigned short)eth->type;
}

但是由于某种我不知道的原因,我无法做到这一点,因为这是为我打印的内容。

Ethernet Header
   |-Destination Address : 58:49:3B:38:B5:11 
   |-Source Address      : E4:FC:82:FD:32:C1 
   |-Protocol            : 8 
|-Dest : 134 //I suppose that this is the address the pointer points to
|-Protocol            : 8 //This matches the Protocol printed above

是因为我以错误的方式返回它还是因为我打印数据的格式错误?请注意,按照我的要求正确打印了协议。但是目标mac却没有。

我在StackOverflow上阅读了各种答案,但无法使其正常工作。如果有人可以帮助我解决问题,我将不胜感激。预先感谢。

P.S:我认为struct ether_header的描述不是必需的,但是如果需要,那么我可以稍后对其进行编辑。

EDIT-1:

struct ether_header {
        unsigned char dhost[ETHER_ADDR_LEN];    // Destination host address
        unsigned char shost[ETHER_ADDR_LEN];    // Source host address
        unsigned short type;                    // IP? ARP? RARP? etc
};

1 个答案:

答案 0 :(得分:3)

结构的shostdhost成员是数组(或可能是指针)。数组将衰减到指向第一个元素的指针,即使用普通eth->dhost&eth->dhost[0]相同。

在现代计算机上,指针通常为32或64位宽,而char通常只有8位宽。换句话说,将指针存储在char中实际上是不可能的。

您需要做的是“返回”指针 而不是单个字节。为此,将destinationsrc定义为指针:

unsigned char *destination, *src;

并更新指向指针的函数参数:

void get_ethernet_header(const u_char *Buffer, int Size,
                         unsigned char** destination,
                         unsigned char** src, unsigned short* qtype)

最后要记住以正确的方式打印它(就像在get_ethernet_header函数内部一样)。其余的可以保持不变。


另一种可能更安全的解决方案是改为使用数组,然后复制数据。然后,您不必依赖包含有效且有效结构的“缓冲区”。