.NET_STAR

打造技术团队,愿与您共同开创事业!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

在博客园博问和CSDN里提交的问题,可很少人很我解答,后面通过摸索出了个解决方案代码:

现在要用C# 做一个WebServices作一个接口供C++调用
   WebServices已经定义好了(这里只说明了一种最简单的Web方法,至于安全性验证全都省略了):
   void Process(byte[] Request, out byte[] Response)(这个参数不可能变的)
   参数说明:接收参数byte[]型,输出结果参数byte[],我根据接收到的Request参数,返回结果数据Respone

Request/Response的包格式如下:


也就是说c++那边解包必须按照这种包的格式去做,因为C++那边和蓝牙通信的协议都已经定义好所以只能用这种格式解包
了,由于以前接触到这种数据包的传输知识很少,不知道该怎么去组包,在这里请问高手了:

比如:
接收到一个参数数据包          request:  请求代码(102)、包长度(5)、请求包数据("12")
通过逻辑处理返回数据包:       response:回应代码(200)、包长度(30)、回应包数据("我是一个persion")

我现在要问的是:
1、怎么去把请求数据包解压成字符串,去得到我的想要的参数
2、怎么样把我的返回数据(回应代码、包长度、回应包数据)组成一个数据包发给C++那边
3、高手们给我解释下数据包到底是什么概念应该怎么转换成数据包

这两天大概问了下说用什么 C#里面的buffer[]数据传过去,但那玩间真没用过!!还有种说是用Arraylist.CopyTo()把数据
压入buffer[],可这些技术都不太明白

我就想如果我把各回应数据组成字符串再强制转换成byte[],后面考虑了下这样应该是不行的

提问者:雷明 - 初学一级


问题补充:问题解决了,贴下代码:

//压包过程
string dataContent = "abcdefg我人间中国人"; //数据包内容
Int16 pack_Len = (Int16)(dataContent.Length * 2 + 2 + 2); //数据包长度(回应码长度+自身长度+数据包长度)
Int16 backCode = 101; //回应码

byte[] buf = new byte[pack_Len]; //定义Byte数组
buf[0] = (byte)(backCode >> 8); //通过移位buf[0]存回应码高位
buf[1] = (byte)(backCode & 0xFF); //通过与操作使用buf[1]存回应码低位

buf[2] = (byte)(pack_Len >> 8); //buf[2]存包长度高位
buf[3] = (byte)(pack_Len & 0xFF); //buf[3]存包长度低位

byte[] dataByte = System.Text.Encoding.Unicode.GetBytes(dataContent); //数据包内容byte
dataByte.CopyTo(buf, 4); //把数据包byte[] 压入到buf数组中

//解包过程
Int16 uBackCode = (Int16)(((buf[0] & 0xFF) << 8) | (buf[1] & 0xFF)); //得到回应码
Int16 u_Pack_Len = (Int16)(((buf[2] & 0xFF) << 8) | (buf[3] & 0xFF)); //得到包长度
string uDataContent = "";

int tempLenght = dataContent.Length * 2;
byte[] temp = new byte[tempLenght];
Array.Copy(buf, 4, temp, 0, tempLenght - 1); //把byte[]数组中属于数据包内容定义到临时数组
uDataContent = System.Text.Encoding.Unicode.GetString(temp); //通过转换进获取数据包内容

posted on 2009-05-06 18:27  雷明  阅读(471)  评论(0编辑  收藏  举报