gpt4 book ai didi

解析字符缓冲区的代码

转载 作者:行者123 更新时间:2023-12-02 22:16:19 31 4
gpt4 key购买 nike

我想解析一个字符缓冲区并将其存储在一个数据结构中。缓冲区的第一个 4 个字节指定名称,第二个四个字节指定值的长度 (n),接下来的 n 个字节指定值。

例如:char *buff = "aaaa0006francebbbb0005swisscccc0013unitedkingdom"

我想从缓冲区中提取名称和值并将其存储在数据结构中。例如:char *name = "aaaa" char *value = "法国"

char *name = "bbbb"
char *value = "swiss"

存储后,我应该能够使用名称访问数据结构中的值。我应该使用什么数据结构?

编辑(来自评论):我尝试了以下方法:

struct sample { 
char string[4];
int length[4];
char *value; };

struct sample s[100];

while ( *buf ) {
memcpy(s[i].string, buf, 4);
memcpy(s[i].length, buf+4, 4);
memcpy(s[i].value, buf+8, s.length);
buf += (8+s.length);
}

我应该调用 memcpy 三次吗?有没有办法只调用 memcpy 一次?

最佳答案

完全不使用 memcpy 怎么样?

typedef struct sample { 
char name[4];
union
{
char length_data[4];
unsigned int length;
};
char value[];
} sample_t;

const char * sample_data = "aaaa\6\0\0\0francebbbb\5\0\0\0swisscccc\15\0\0\0unitedkingdom";

void main()
{
sample_t * s[10];
const char * current = sample_data;
int i = 0;

while (*current)
{
s[i] = (sample_t *) current;
current += (s[i])->length + 8;
i++;
}

// Here, s[0], s[1] and s[2] should be set properly

return;
}

现在,您永远不会明确指定表示长度的 4 个字节是包含字符串表示形式还是实际的二进制数据;如果它是四个字符,需要通过 atoi() 或类似的方式运行,那么您需要进行一些后处理,例如

    s[i]->length = atoi(s[i]->length_data)

在结构可用之前,这反过来意味着源数据必须是可写的并且可能复制到本地。但即便如此,您也应该能够立即复制整个输入缓冲区,而不是将其切碎。

另外,请注意,这依赖于使用此结构的任何事物都尊重长度字段,而不是将值字段视为以空字符结尾的字符串。

最后,像这样使用二进制整数数据显然是架构相关的,具有以下所有含义。

关于解析字符缓冲区的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398774/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com