美文网首页
iOS OC socket Byte传输,图片上传

iOS OC socket Byte传输,图片上传

作者: Raining7 | 来源:发表于2017-11-21 14:35 被阅读54次
    因项目要求跟公司底层接口对调,底层是C++写的。需要用byte传输QAQ

    我用的是三方的socket GCDAsyncSocket。开始麻代码!
image image image
    以上是后台给的传输协议。当时看到就是懵逼的。

    网上翻了翻,我先是用的一个结构体来发送数据。

    但是中间出现了一个坑,心跳的字节数是13个十六进制字符,OC上构造的协议头会变成16个十六进制字符。

    OC中的struct会自动填补对齐,用4个十六进制字符来判断是否自动填补了。

            "IwsFile"+10+1+13

            7+1+(1+3)+(1+3) = 16

    研究了很久都没研究出来,只有另寻它法。

    在网上翻了片文章,NSData存储的就是字节流,这就轻松了不少,直接一波操作。

    NSMutableData*msgData = [[NSMutableData alloc]init];

    图片:

            NSData*picData =UIImagePNGRepresentation(image);

            [msgData appendData:picData];

    字符串:a

            NSString*TempString =@"IwsFile";

            [msgData appendBytes:[TempString cStringUsingEncoding:NSASCIIStringEncoding]length:7];

    整型:十进制->十六进制->NSData

            NSData*bVersion = [self convertHexStrToData:[self ToHex:16]];

            [msgData appendData:bVersion];

    发送各种长度的时候,遇到了一个坑。

            a3 0d 00 00 传过去 变成了00 00 0d a3。

            这个原因是服务器的处理器,是从低位到高位,字节序相反。

            那么就对各种长度进行移位操作。

            NSMutableData*uLen = [NSMutableData dataWithData:[self convertHexStrToData:[self ToHex:picDataLength]]];

            Byte*uLenByte = (Byte*)[uLenbytes];

            uLenByte[3] = picDataLength >>24;

            uLenByte[2] = picDataLength >>16;

            uLenByte[1] = picDataLength >>8;

            uLenByte[0] = picDataLength >>0;

            [socketData appendData:uLen];

'''
最后上传成功!
总结一下里面的坑。首先要确定服务器和客户端都是大端还是小端、32位还是64位、两边编译器结构体对齐规则是否一样、高低位顺序是否一致。还是用三方序列化来交换数据,JSON、protobuffer、thrift...

相关文章

网友评论

      本文标题:iOS OC socket Byte传输,图片上传

      本文链接:https://www.haomeiwen.com/subject/eocwvxtx.html