Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中序列化字符串_C_Arrays_String_Serialization_Structure - Fatal编程技术网

在c中序列化字符串

在c中序列化字符串,c,arrays,string,serialization,structure,C,Arrays,String,Serialization,Structure,我正在尝试在字节流中序列化结构。基本上,我必须使用这种类型的结构: typedef struct { unsigned a, b; unsigned c, d; } struct_t; 我必须将这个结构的元素转换成字符串的字符。例如,我得到以下信息: struct_t *structure; /* pointer to the structure due to be converted */ char *s; /* array of char where to write the

我正在尝试在字节流中序列化结构。基本上,我必须使用这种类型的结构:

typedef struct { 
   unsigned a, b;
   unsigned c, d;
} struct_t;
我必须将这个结构的元素转换成字符串的字符。例如,我得到以下信息:

struct_t *structure; /* pointer to the structure due to be converted */
char *s; /* array of char where to write the string result of the conversion */
int len; /* lenght of the array s */
我在理解如何通过序列化实现时遇到了一些问题。
提前感谢您的帮助。

考虑到这些要求,这似乎可以工作,如我的:

您可以讨论接口的详细信息,但如果字符串与
serialize\u struct\t()
的输出不匹配,或者与匹配的字符串长度不匹配(这样您就知道从何处继续搜索),它将返回
-1
。格式中的空格表示可选空白<代码>%u仍然跳过可选的白色。
%c
允许您在末尾检测除
]
之外的其他内容;如果在格式字符串中使用litera
]
,则无法发现问题。而
%n
告诉您匹配的偏移量,它位于末尾。
%n
转换不计算在内

显然,根据所选择的序列化格式,您需要更改反序列化扫描程序以匹配


这就是序列化和反序列化的工作方式——序列化格式(应该严格定义)控制反序列化代码需要识别的内容。反序列化代码可以更加灵活(例如,您可以反对显示的格式字符串中的所有空格,但这会使接受的格式更加严格),但肯定应该识别序列化代码生成的任何内容。请参阅维基百科上的,又名Postel定律。

鉴于这些要求,这似乎可以奏效,正如我在以下文章中提到的:

您可以讨论接口的详细信息,但如果字符串与
serialize\u struct\t()
的输出不匹配,或者与匹配的字符串长度不匹配(这样您就知道从何处继续搜索),它将返回
-1
。格式中的空格表示可选空白<代码>%u仍然跳过可选的白色。
%c
允许您在末尾检测除
]
之外的其他内容;如果在格式字符串中使用litera
]
,则无法发现问题。而
%n
告诉您匹配的偏移量,它位于末尾。
%n
转换不计算在内

显然,根据所选择的序列化格式,您需要更改反序列化扫描程序以匹配


这就是序列化和反序列化的工作方式——序列化格式(应该严格定义)控制反序列化代码需要识别的内容。反序列化代码可以更加灵活(例如,您可以反对显示的格式字符串中的所有空格,但这会使接受的格式更加严格),但肯定应该识别序列化代码生成的任何内容。请参阅上的Wikipedia,又名Postel定律。

似乎需要将结构的内容转换为可打印的字符串。提出一种格式并使用
snprintf
编写字符串。序列化数据将在哪里使用?你想要多大的灵活性?有无限的可能性,而且大多很简单。你需要标记起点和终点吗
snprintf(buf,len,“[%u,%u,%u,%u]”,结构->a,结构->b,结构->c,结构->d)
可能足够了(如果您检查输出是否被截断-从
snprintf()捕获并测试返回值
)。很好地解释了序列化。现在我不再使用XML,而是使用JSON库(web上到处都在讨论优缺点)。注意不要简单地将其转换为字节指针来序列化。如果您最终以不同的endianness将数据读回系统,则可能会遇到endianness问题。我要做的是实现一个函数,其标题如下:
char*struct\u to\u string(struct\u t*structure,char*s,int len)此函数创建结构的字符串表示形式\如果转换成功,则retval必须为s,否则\retval必须为NULL。我正在进行一个项目,它需要将字符串(称为字符串[I])转换为结构(完成,工作正常),然后再将此结构转换为新字符串,这显然与字符串[I]基本相同。似乎需要将结构的内容转换为可打印的字符串。提出一种格式并使用
snprintf
编写字符串。序列化数据将在哪里使用?你想要多大的灵活性?有无限的可能性,而且大多很简单。你需要标记起点和终点吗
snprintf(buf,len,“[%u,%u,%u,%u]”,结构->a,结构->b,结构->c,结构->d)
可能足够了(如果您检查输出是否被截断-从
snprintf()捕获并测试返回值
)。很好地解释了序列化。现在我不再使用XML,而是使用JSON库(web上到处都在讨论优缺点)。注意不要简单地将其转换为字节指针来序列化。如果您最终以不同的endianness将数据读回系统,则可能会遇到endianness问题。我要做的是实现一个函数,其标题如下:
char*struct\u to\u string(struct\u t*structure,char*s,int len)此函数创建结构的字符串表示形式\如果转换成功,则retval必须为s,否则\retval必须为NULL。我正在做一个项目,它需要将字符串(称为string[I])转换为结构(完成,工作正常),然后再转换为
char *serialize_struct_t(const struct_t structure, char *s, int len)
{
    if (snprintf(s, len, "[%u,%u,%u,%u]", structure->a, structure->b,
                 structure->c, structure->d) < len)
        return s;
    return 0;
}
int deserialize(const char *buffer, struct_t *structure)
{
    char c;
    int  len;
    if (sscanf(buffer, " [%u ,%u ,%u ,%u %c%n", &structure->a,
               &structure->b, &structure->c, &structure->d, &c, &len) != 5 ||
        c != ']')
        return -1;
    return len;
}