c语言序列化和反序列化

本文介绍了如何利用tpl库在C语言中进行数据的序列化和反序列化,采用TLV协议形式(key,type,length,value)进行数据组织。通过序列化将数据转换为可传输的格式,反序列化则能将接收到的数据恢复为原始结构。提供了tplut.h和tplut.c的源代码以及测试案例,适用于各种平台。" 131875280,7337247,移动应用开发详解:从Android到iOS的跨越,"['移动开发', 'Android开发', 'iOS开发', '编程实践', '架构设计']
摘要由CSDN通过智能技术生成

c语言序列化和反序列化

网络调用,数据存取,数据传输都需要把数据序列化和反序列化。杀鸡不喜欢用牛刀,自己从底层设计协议又太繁琐,难以维护和扩展。使用 tpl (http://troydhanson.github.io/tpl/)这个库,可以很方便地构造自己的协议。

我采用 TLV 协议形式,即 (key,type,length,value) 4元组。key 是唯一的名称,type 是key保存的值的类型(用一个字符表示),length 是 value 的长度(应该叫 size 更贴近),value 是可以保存任何数据。发送数据的一方发送【“name”=“cheungmine”, “country”=“china”】, 接收数据的一方接收到之后,成为一个数组(UTArray),可以转为map(kvpairs_to_map),这样就容易获取特定些字段的内容了。

本文不特定于用户的具体协议内容,也不考虑数据存放的字节次序。这些都由用户自己完成。

因此可以定义个 tlv 数据节如下:

typedef struct kvpair_t
{
	char *key;        /* we'll use this field as the key */
    char type;

	union {
		struct {
			void *val;
			uint32_t siz;
		};

		tpl_bin bval;
	};
	
	UT_hash_handle hh; /* makes this structure hashable */
} kvpair_t;

一个数据祯由1~N个这样的TLV 构成。我实现了基本的序列化(pack)和反序列化(unpack)基础功能。任何协议只要在这基础封装自己特有的字段(key)即可。下面是 tplut.h和tplut.c以及测试代码。
下面的代码可以在任何平台编译使用。

tplut.h

/***********************************************************************
* Copyright (c) 2008-2080 pepstack.com, 350137278@qq.com
*
* ALL RIGHTS RESERVED.
* 
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 
*   Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
********************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车斗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值