在C

时间:2016-02-15 08:47:46

标签: c arrays

假设我们有一个字符数组,

char recvData[1024];

现在,使用函数

从客户端输入recvData[1024]的数据
int nBytes = recvfrom(udpSocket, recvData, sizeof (recvData),
                      0, (struct sockaddr *) &serverStorage,
                      &addr_size);

从客户端代码接收的数据存在于recvData中,这是一个字符数组。

我们需要将3个字符数组中的每一个作为null终止:

首先只包含recvData

内容的第一个字节

第二个包含recvData

内容的下一个6字节

第三个包含recvData内容的最后16个字节。

如果需要以上述格式,我们将使用什么来从recvData数组中分割数据。

3 个答案:

答案 0 :(得分:1)

这取决于您是否确实需要将它们分开,或者您是否只需要更好的方式来访问数据。

如果只是为了方便,那么:

const char first = recvData[0];
const char *second = &recvData[1];
const char *third = &recvData[7];

请记住,如果您收到另一个数据包,数据将会消失。如果您不介意将数据保存在一起,但确实需要缓冲区的副本,那么这可能会更好:

typedef struct Something {
    char first;
    char second[6];
    char third[16];
} Something;
...
Something data;
data.first = recvData[0];
memcpy(&data.second, &data[1], 6);
memcpy(&data.third, &data[7], 16);

如果你需要实际拥有3个独立的数组,那么:

char* something = malloc(the_size);
memcpy(something, &recvData[offset], the_size);

就是你做的。

正如评论中所提到的,这不会使数组终止。但你应该能够根据其他答案做到这一点。

答案 1 :(得分:1)

零终止的要求排除了几个" hackish"解决方案,如memcpy() recvData over result_t,或使用联合 - 我们必须单独复制字段。

经过一些抛光,将幻数转换为宏常数并将事物放入函数中,看起来有点像这样。当然,您应该为所有内容分配更有意义的名称。

#include <string.h>

#define FIRST_SIZE   1
#define SECOND_SIZE  6
#define THIRD_SIZE  16

struct result_t
{
    char first[ FIRST_SIZE + 1 ];
    char second[ SECOND_SIZE + 1 ];
    char third[ THIRD_SIZE + 1 ];
};

result_t handle_recvData( char * recvData )
{
    struct result_t result;

    memcpy( result.first, recvData, FIRST_SIZE );
    result.first[ FIRST_SIZE ] = '\0';

    memcpy( result.second, recvData + FIRST_SIZE, SECOND_SIZE );
    result.second[ SECOND_SIZE ] = '\0';

    memcpy( result.third, recvData + FIRST_SIZE + SECOND_SIZE, THIRD_SIZE );
    result.third[ THIRD_SIZE ] = '\0';

    return result;
}

答案 2 :(得分:1)

如果您需要将所有子数组作为空终止且接收到的数据不包含这些空终止,那么您需要复制数组。

char recvData1[2];
char recvData2[7];
char recvData3[17];

memcpy(recvData1, recvData, 1);
recvData1[1] = '\0';
memcpy(recvData2, recvData+1, 6);
recvData2[6] = '\0';
memcpy(recvData3, recvData+7, 16);
recvData3[16] = '\0';

HandleReceiveParts(recvData1, recvData2, recvData3);