1

我有一个大学项目需要将 int 转换为 char 缓冲区。我需要使用 memcpy 但是当我复制值时它不起作用,因为 msg_buf 仍然是空的。我有一些限制: - 我需要使用 memcpy,因为我的老师会测试我的代码,比如 memcmp(msg_str, &opcode, 2) == 0)。

这是我的代码:

int message_to_buffer(struct message_t *msg, char **msg_buf){
    int opcode = htons(msg->opcode);
    int c_type = htons(msg->c_type);
    int result;
    int buffer = sizeof(opcode) + sizeof(c_type);

    switch(msg->c_type){

      case CT_RESULT:

            result = htonl(msg->content.result);
            buffer += sizeof(result);
            *msg_buf = (char*)malloc(sizeof(char) * 12);

            if(msg_buf == NULL)
                return -1;
            memcpy(*msg_buf,&opcode,sizeof(opcode));

            break;

    };

    return buffer;
}

这里有什么问题?

4

3 回答 3

1

我认为您的问题可能是您在 int 上调用 htons()。htons() 旨在与 short 类型的值一起使用,因此您可能会丢失 msg->opcode 和 msg->c_type 的高 16 位。尝试用 htonl() 代替 htons()。

此外,看起来您正在使用 malloc() 分配一个 12 字节的缓冲区,但只向其中写入 4 个字节,而后 8 个字节未初始化/未定义。这是故意的吗?

于 2013-10-20T01:34:23.537 回答
1

更具体地说,您需要将短裤复制为短裤,而不是整数。sizeof(short) != sizeof(int) (通常取决于架构):

int message_to_buffer(struct message_t *msg, char **msg_buf){
    short opcode = htons(msg->opcode);
    short c_type = htons(msg->c_type);
    int result;
    char* buffer = NULL, *buf_start=NULL;
    *msg_buf = NULL;

    switch(msg->c_type){

      case CT_RESULT:

            result = htonl(msg->content.result);
            buffer = (char*)malloc(sizeof(char) * 12);

            if (buffer == NULL)
                return -1;
            buf_start = buffer;
            memcpy(buffer,&opcode,sizeof(opcode)); // sizeof(short) == 2; sizeof(int) == 4
            buffer += sizeof(opcode);
            memcpy(buffer,&c_type,sizeof(c_type)); // sizeof(short) == 2; sizeof(int) == 4
            buffer += sizeof(c_type);
            memcpy(buffer,&result, sizeof(result));
            buffer += sizeof(result);
            *msg_buf = buf_start;
            break;

    };

    return buffer - buf_start;
}
于 2013-10-20T01:55:46.777 回答
0

为什么不使用itoa函数转换intchar*?所以你替换你的memcpywithitoa函数。

参考:http ://www.cplusplus.com/reference/cstdlib/itoa/

[编辑] 如果你的编译器不支持itoa,你可以sprintf改用。

于 2013-10-20T01:30:51.347 回答