如何在C中创建自定义char?[duplicate]

9jyewag0  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(166)

此问题在此处已有答案

How do I create my own packet to send via UDP?(4个答案)
8天前关闭。
我必须为Tftp客户端创建一个请求数据报(RRQ),如下所示:

但是我不能使用结构体,因为字段的长度是可变的。
我尝试了struct和一些在char上迭代的东西。

u91tlkcl

u91tlkcl1#

创建一个字节数组并追加到数组中,你可以使用指针算法来跟踪你写的位置,就像光标一样。
通过跟踪归档和模式字符串在请求内存中的起始位置,我们可以使自己的工作变得更容易,这样我们以后就可以很容易地找到它们。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>

typedef struct {
    char *archive;
    char *mode;
    char *request;
} Read_Request;

Read_Request *read_request_create(const char *archive, const char *mode) {
    Read_Request *rrq = malloc(sizeof(Read_Request));

    // Allocate sufficient memory for the opcode and both strings,
    // including the terminating nulls.
    rrq->request = malloc(2 + strlen(archive) + 1 + strlen(mode) + 1);

    // Start the request with the opcode.
    // 2 byte network byte order integer.
    uint16_t opcode = htons(1);
    memcpy(rrq->request, &opcode, sizeof(opcode));

    // Put the start of the archive 2 bytes in, just after the opcode.
    rrq->archive = rrq->request + 2;

    // Copy the archive string into position.
    strcpy(rrq->archive, archive);

    // Put the start of the mode just after the archive and its null byte.
    rrq->mode = rrq->archive + strlen(archive) + 1;

    // Append the mode.
    strcpy(rrq->mode, mode);

    return rrq;
}

然后打印就很容易了。打印2字节的操作码。然后由于C字符串在空字节处停止,我们可以简单地打印存档和模式字符串。

void read_request_print(Read_Request *rrq) {
    // Turn the first two bytes (the opcode) into two hex characters.
    unsigned char *opcode = (unsigned char *)rrq->request;
    printf("opcode: %0x%0x\n", opcode[0], opcode[1]);

    printf("archive: '%s'\n", rrq->archive);

    printf("mode: '%s'\n", rrq->mode);
}

int main() {
    Read_Request *rrq = read_request_create("archive", "mode");

    read_request_print(rrq);
}

相关问题