iOS OC socket Byte传输,图片上传
2017-11-21 本文已影响54人
Raining7
因项目要求跟公司底层接口对调,底层是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...