你永远不知道二进制读取图片后会存在什么

最近在研究socket传输文件,由于项目需求,采用的是二进制读取文件,分割成若干包,加上其他信息和起始、结束标志后发送。接收以后先解析再拼接。但是在测试中问题就来了,首先是发送了1000个包,结果接收了1200多个包,研究以后发现这是因为socket 的tcp协议粘包,这个问题解决了。

然后就是接收了5个包以后,就不解析了。代码如下:

if (buffer.Count < 34)
            {
                readlength = 0;
                return null;
            }
            //查找\r\n标记符
            for (int i = buffer.Offset, len = buffer.Offset + buffer.Count; i < len; i++)
            {
                if (buffer.Array[i] == 42 && i + 36 < len && buffer.Array[i + 1] == 35)
                {
                    //ArraySegment<byte> lidarcodeposbytes = new ArraySegment<byte>(buffer.Array, 0, 4);
                    int lidarcodepos = BitConverter.ToInt32(buffer.Array, 2);
                    int filenamepos = BitConverter.ToInt32(buffer.Array, 6);
                    int filestreampos = BitConverter.ToInt32(buffer.Array, 10);
                    long TotalFileBytesLength = BitConverter.ToInt64(buffer.Array, 14);
                    int CurPackage = BitConverter.ToInt32(buffer.Array, 22);
                    int TotalPackages = BitConverter.ToInt32(buffer.Array, 26);
                    int bodylength = BitConverter.ToInt32(buffer.Array, 30);
                    for (int j = i + 34; j < len; j++)
                    {
                        if (buffer.Array[j] == 35 && (j + 1) < len && buffer.Array[j + 1] == 42)
                        {
                            Console.WriteLine(CurPackage + "\t" + buffer.Count.ToString());

                            if (lidarcodepos > filenamepos || filenamepos > filestreampos)
                            {
                                readlength = 0;
                                return null;
                            }

debug发现,buffer的count是在不断增加的,每次增加的数量就是每次发送的字节数,再进一步分析,就是

if (buffer.Array[j] == 35 && (j + 1) < len && buffer.Array[j + 1] == 42)

没有进去,这里是一条消息结束的标识符,两个字节,用过好几种,比如“CK”,“*#”等,最终发现,这些标识符的字节在图片中都存在,所以没有进一步解析,换了一个文本文件就没问题了,所以标识符如何设置也是一门学问

package { import flash.display.Bitmap; import flash.display.Loader; import flash.display.NativeMenu; import flash.display.NativeMenuItem; import flash.display.NativeWindow; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileStream; import flash.net.FileFilter; import flash.net.navigateToURL; import flash.net.URLRequest; import flash.utils.ByteArray; public class Main extends Sprite { private var rootMenu:NativeMenu = new NativeMenu; private var fileMenu:NativeMenu = new NativeMenu; private var openItem:NativeMenuItem = new NativeMenuItem("打开文件"); private var quitItem:NativeMenuItem = new NativeMenuItem("退出"); private var helpMenu:NativeMenu = new NativeMenu; private var fsnhf:NativeMenuItem = new NativeMenuItem("00"); private var window:NativeWindow = stage.nativeWindow; private var loader:Loader = new Loader; private var imageFileFilter:FileFilter = new FileFilter("图片(*.jpg;*.png;*.gif;*.jpeg)", "*.jpg;*.png;*.gif;*.jpeg"); public function Main():void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; buildMenu(); configListeners(); } private function buildMenu():void { rootMenu.addSubmenu(fileMenu, "文件"); fileMenu.addItem(openItem); fileMenu.addItem(quitItem); rootMenu.addSubmenu(helpMenu, "帮助"); helpMenu.addItem(fsnhf); window.menu = rootMenu; } private function configListeners():void { openItem.addEventListener(Event.SELECT, eventHandler); quitItem.addEventListener(Event.SELECT, eventHandler); fsnhf.addEventListener(Event.SELECT, eventHandler); } private function eventHandler(event:Event):void { switch(event.target) { case openItem: var file:File = new File; file.addEventListener(Event.SELECT, selectFile); file.browseForOpen("打开文件", [imageFileFilter]); break; case quitItem: window.close(); break; case fsnhf: navigateToURL(new URLRequest("00")); break; } } private function selectFile(event:Event):void { var file:File = event.target as File; var stream:FileStream = new FileStream; stream.open(file, FileMode.READ); var bytes:ByteArray = new ByteArray; stream.readBytes(bytes, 0, stream.bytesAvailable); stream.close(); loader.unload(); loader = new Loader; loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded); loader.loadBytes(bytes); addChild(loader); } private function imageLoaded(event:Event):void { event.target.removeEventListener(Event.COMPLETE, imageLoaded); var bitmap:Bitmap = Bitmap(event.target.loader.content); window.width = bitmap.width; window.height = bitmap.height + 30; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值