分布式进程通信――数据编码
分布式进程通信――数据编码
(Risun , 2004-6-16)
进程间通信是分布式系统中首要解决的基本问题,在面向对象的分布式系统中,进程间通信通常表现为远程对象间的消息传递。要在基于二进制流的网络上传递抽象的数据类型或对象,必须以通信双方可以理解的格式对数据进行编码。本文讨论了数据编码中的一些基本问题、目前广泛采用的数据编码方式和用户开发自定义数据编码协议时需要注意的问题。
字节顺序:
讨论编码之前,需要首先明白“字节顺序”。字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。内存的生长方向是不变的,而内存中数据是由CPU解释的,所以这个特性是由CPU而不是内存来决定的。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。
譬如:
内存地址生长方向为: 从左到右 由低到高(这是不变的)
某多字节类型数字:0x89ABCDEF
降序(Big-endian)大端字节序 存储时 由左到右 0x89ABCDEF
升序(Little-endian)小端字节序 存储时 由右向左 0XEFCDAB89
IP网络字节序:网络上传输的字节流顺序,是大端字节序。在不同主机的进程间通过ip通道交换信息时,必须
处理两个主机字节序的不同,一般的将主机字节序转换到网络字节序或反之。
字节序是和数据类型相关,对于一个int32类型数字x,在转化时需要如下步骤:
发送端:
1. int32 y = hosttoNet(x);
2. byte byte_addr[] = getBytes(y);
3. 将varray填入相应的网络数据流中
接受端:
1. 从网络数据流中获得数据起时地址byte_addr;
2. int32 y = toInt32(byte_addr, 0);
3. int32 x = nettoHost(y);
外部数据表示和编码
Corba 公共数据表示CDR
CDR定义了大序和小序法排序的表示。能表示任何不使用指针的由基本类型和构造类型组成的数据结构。
基本类型(short 等)值以它的大小为索引放在字节序列中。假设字节序列的索引从0开始,那么n字节(n=1,2,4,8)大小的基本类型值将追加到字节中的索引为n的倍数的位置。浮点值遵循IEEE标准――符号,指数,小数部分放在按大序排序的0-n字节,如果小序则反过来。
组合类型,sequence:长度+有序元素 ;string:长度+有序字符; array:有序数组元素; struct:按成员申明顺序表示; enumerated:无符号长整型; union:类型标志+成员。
CORBA接口编译器会根据远程方法的参数和放回类型定义为远程方法的参数和结构生成相应的编码解码的操作。
问题:为什么n字节(n=1,2,4,8)大小的基本类型值将追加到字节中的索引为n的倍数的位置,而不是连续的?
Java对象序列化
在Java RMI中,对象和基本数据类型值都可以作为方法调用的参数和结果传递。作为参数或结果传递的对象必须实现Serializable接口以支持序列化。Java对象序列化的详细说明参考相关文档。
自定义编码方式
一般的,直接基于tcp/ip网络的C/S系统中,用户可以自己定义合适的数据编码方式将需要通过网络传输的对象或者基本数据类型编码,编码和解码的工作在网络接受层之上。
posted on 2004-06-16 23:00 哲学 艺术 程序 人生 阅读(752) 评论(0) 编辑 收藏 举报