在计算机程序中经常需要进行数据交换,通常做法是先将要交换的数据按照一定的格式组合起来,再把这些组合数据作为一个整体传递给对方。这个经过组合 的数据就是报文,每个要交换的数据就是数据域,将数据域组合成报文的过程称为报文组包或报文打包,从报文中提取出数据域的过程称为报文解包或者报文解析。
报文的组织形式多种多样,常见的有字符串报文、8583包报文、XML报文、结构报文等等,某些程序甚至可以定义自己的报文组织形式。
18.1.1 字符串报文类型
字符串报文是指将各种不同数据类型的数据域信息转化为字符串,再组合成一行字符的报文形式。根据报文中同一数据域每次所占用的字符字节数的情况,字符串报文可以分为以下几种:
1. 固定长度字符串报文
简称固定长度报文,报文中的每个数据域在报文中都占用某个特定的字节长度,不会随着数据域具体内容的变化而变化。如18-1是某个银行代发工资系统中固定长度字符串报文文件的例子:
表18-1 固定长度字符串报文
498)this.style.width=498;" border="0" height="100" width="661"> |
以上每条报文均长32个字节,分为4个数据域,每个域的含义如表18-2所示:
表18-2 固定长度字符串报文实例解析
编号 | 长度 | 说明 | 类型 | 第一行内容 | 第二行内容 |
1 | 1 | 行序号 | 整型 | 1 | 2 |
2 | 13 | 卡号 | 字符串 | 9559901099999 | 53591010988 |
3 | 6 | 姓名 | 字符串 | zyx | huping |
4 | 12 | 资金 | 浮点型 | 234.21 | 19732.01 |
2. 固定分隔字符串报文
简称固定分隔报文,报文中的每个数据域在报文中占用的字节长度不固定,域与域之间通过某个特定的字符串来分隔,如表18-3是由字符串"|"分隔的报文实例。
表18-3 固定分隔字符串报文
498)this.style.width=498;" border="0" height="74" width="661"> |
以上报文与表18-1中的固定长度报文描述的是同一实例,但此处第1条报文长26字节,第2条报文长28字节,可见固定分隔字符串报文的每条报文长度并不一致,同时每个数据域中一般不会有多余的空格。
3. 混合格式字符串报文
简称组合报文,它混和了前两种报文的组织格式,一般有三种表现形式:
(1) 固定长度报文中某数据嵌套一个固定分隔报文,如表18-4所示;
表18-4 固定长度报文嵌套固定分隔报文
498)this.style.width=498;" border="0" height="101" width="663"> |
整个报文全长28个字节,共分为3个数据域。其中第二个数据域长15个字节,由一个固定分隔报文组成。这个固定分隔报文以字符串","分隔开,共两个域,第一个域表示姓名,第二个域表示资金。
(2) 固定分隔报文中某数据域嵌套一个固定长度报文,如表18-5所示:
表18-5 固定分隔报文嵌套固定长度报文
498)this.style.width=498;" border="0" height="76" width="662"> |
第1条报文长29个字节,第2条报文长27个字节,共分为3个数据域。其中第二个数据域由一个固定长度报文组成,这个固定长度报文分为两个域:第一个域表示姓名,共6个字节;第二个域表示资金,共8个字节。
(3) 固定长度报文的数据域之间由字符串之间通过某个特定的字符串来分隔,如表18-6是由字符串"|"分隔的报文实例:
表18-6 固定字符串分隔的固定长度报文
498)this.style.width=498;" border="0" height="125" width="661"> |
整个报文全长22个字节,共分为3个数据域,每个域分别长4字节、6字节和10字节,域与域之间通过字符串"|"分隔。
18.1.2 字符串报文传送方式
字符串报文具有简单和便于理解的特点,因此被广泛的运用于实际的数据传送中。一般来讲,字符串报文的传送有两种最常见的方式:报盘方式和实时交易方式:
1. 报盘方式
本方式一般应用于批量业务中。比如某单位委托银行为其员工代发工资,单位将先把每个员工的工资信息组包成一条字符串报文,然后把这些报文合写在一个文件中,最后把这个文件通过手工或自动FTP等方式传送给银行。银行则解析此文件中的每一条报文信息,然后执行批量代发业务。
2. 实时交易方式
本方式一般应用于零星业务中。比如每当有交易发生时,ATM都将交易的基本信息组包成一条字符串报文,然后将这个字符串通过套接字通信等方式发送到银行主机。银行主机则解析此条报文信息,再执行相应的交易。