AS3与.net之间的Socket编码转换的endian问题
2010-12-01 00:58
225 查看
之前一直都是用.net,最近项目需要在C#和AS3之间建立socket通信,于是就研究了一下AS3的socket。用起来的时候,发现AS3的socket与C#的socket用法差别较大。但是这些都还说得过去,可是一个endian却是把我恶心了一番。
由于对字符编码了解不多,我在试用AS3的socket的函数writeInt()的时候,C#端接收到的数字总是跟flash端发送的值不一致。我调试时发现同一个整数,flash端将其转换成的字节数组跟C#将其转换成的字节数组是刚好相反。曾经动了手动反转字节数组的念头,可是觉得AS3的socket也不该弱到这种地步吧,于是上网查找,可惜,搜索编码转换相关的一系列的关键字,很少见到讲AS3和.net互发数字的内容,都是在讲字符串怎么发的。
横下心来,对AS3的socket对象一个属性一个属性的研究,发现了endian这个属性。再次搜索endian,拨云见日,终于被我发现了编码集中的正序、反序这个概念。网上讲了很多,这里不再一一列举。总而言之言而总之,就是编码时的字节数组的顺序有正反两种情况。风传是跟CPU有关,但是这个我们就不用关心了。
知道了这个,那就好办了,AS3中可以通过如下代码控制字节数组中的数据的写入或读出方式:
//client为外部声明的AS3 Socket对象 var arrBytes:ByteArray = new ByteArray(); client.readBytes(arrBytes);
//读取前设置endian client.endian=Endian.LITTLE_ENDIAN; //client.endian=Endian.BIG_ENDIAN; var i:int = arrBytes.readInt();
//每次读取都可以设置此次读取的endian
client.endian=Endian.LITTLE_ENDIAN;
var d:int = arrBytes.readInt();
AS3的Socket的endian有两个值:一个LITTLE_ENDIAN,一个
BIG_ENDIAN,默认是BIG_ENDIAN。问题就出在C#端如果跑的是Intel的cpu
(通常都是),C#的BitConverter是LITTLE_ENDIAN。所以,在我把flash
端设置成LITTLE_ENDIAN后,AS3和.net之间终于可以正常的发送信息了。
至于C#端的代码,十分简单,不想花费时间再次发明轮子,这里就从略了。
由于对字符编码了解不多,我在试用AS3的socket的函数writeInt()的时候,C#端接收到的数字总是跟flash端发送的值不一致。我调试时发现同一个整数,flash端将其转换成的字节数组跟C#将其转换成的字节数组是刚好相反。曾经动了手动反转字节数组的念头,可是觉得AS3的socket也不该弱到这种地步吧,于是上网查找,可惜,搜索编码转换相关的一系列的关键字,很少见到讲AS3和.net互发数字的内容,都是在讲字符串怎么发的。
横下心来,对AS3的socket对象一个属性一个属性的研究,发现了endian这个属性。再次搜索endian,拨云见日,终于被我发现了编码集中的正序、反序这个概念。网上讲了很多,这里不再一一列举。总而言之言而总之,就是编码时的字节数组的顺序有正反两种情况。风传是跟CPU有关,但是这个我们就不用关心了。
知道了这个,那就好办了,AS3中可以通过如下代码控制字节数组中的数据的写入或读出方式:
//client为外部声明的AS3 Socket对象 var arrBytes:ByteArray = new ByteArray(); client.readBytes(arrBytes);
//读取前设置endian client.endian=Endian.LITTLE_ENDIAN; //client.endian=Endian.BIG_ENDIAN; var i:int = arrBytes.readInt();
//每次读取都可以设置此次读取的endian
client.endian=Endian.LITTLE_ENDIAN;
var d:int = arrBytes.readInt();
AS3的Socket的endian有两个值:一个LITTLE_ENDIAN,一个
BIG_ENDIAN,默认是BIG_ENDIAN。问题就出在C#端如果跑的是Intel的cpu
(通常都是),C#的BitConverter是LITTLE_ENDIAN。所以,在我把flash
端设置成LITTLE_ENDIAN后,AS3和.net之间终于可以正常的发送信息了。
至于C#端的代码,十分简单,不想花费时间再次发明轮子,这里就从略了。
相关文章推荐
- .Net 3.0 项目与.Net4.0项目之间互相引用的问题.
- 关于Java和.NET之间的通信问题(JSON)
- .net做的exe和electron做的exe之间的通信问题
- 如何修复.Net和COM之间枚举名称的问题(续)
- 如何修复.Net和COM之间枚举名称的问题
- 用winsock编的客户端与服务端在本地运行时,互相之间的通信是否过网卡的问题
- .NET 模板丢失问题解决方法
- 项目中遇到的零散问题(.NET方面)
- .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决
- [讨论]在.NET下获取硬盘序列号的问题
- 在DLL间或者DLL与EXE之间传递vector对象或指针的问题
- 用Excel导入Oracle数据库中时候 提示在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 问题解决!!!
- fork()子进程与父进程之间的文件描述符问题
- .NET、C#和ASP.NET之间的区别
- int与NSNumber之间的相互转化,以及转化问题对数值比较的影响
- .net 连接不上oracle问题 ORA-06413: 连接未打开
- IIS和.net framework 4.0的安装顺序导致的问题(重新注册.net 4.0)
- .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
- window.showModalDialog刷新父窗口 父子窗口之间传值 问题
- 准备.Net转前端开发-WPF界面框架那些事,值得珍藏的8个问题