注:转载自按字节定义网络、蓝牙数据传输协议
按字节定义网络、蓝牙数据传输协议
先了解number、string、json格式数据、文件到二进制data数据的相互转换(Object-C)
number --> data 十进制转二进制
NSInteger number = 101;
NSData* numberData = [NSData dataWithBytes:& number length:4];
data --> number 二进制转十进制
NSInteger number = 0;//一定要给初始值,否则得出的结果是错误的
[data getBytes:&number range:NSMakeRange(0, 4)];//然后你的number里就有值了
string --> data
NSString* message = @"Hello World!";
NSData* data = [message dataUsingEncoding:(NSUTF8StringEncoding)];
data --> string
NSString* message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
json格式数据(字典、数组或者更深层的嵌套) --> data
NSArray* array = @[@{@"key": @"value"}, @(2)];
NSError* error = nil;
NSData* data = [NSJSONSerialization dataWithJSONObject:array options:kNilOptions error:&error];
data --> json格式数据
NSMutableArray* mutableArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:&error];
if ([mutableArray isKindOfClass:[NSMutableArray class]]) {
NSLog(@"转换成功");
}
文件 --> data
NSData* data = [NSData dataWithContentsOfFile:@"/document/fileName.mp3"];
- 注:文件大的时候不可以直接全部转为data放到内存中,发送的时候可分段读取到buffer中,系统自带的类NSInputStream 、NSOutputStream、 NSFileHandle均可以。
data --> 文件
图片示例
UIImage* image = [UIImage imageWithData:data]
- 注:文件一般尽量不要在内存里加载为data去直接使用,会比较占用内存,一般都会把data写入本地再去调用
##############################################################################################################
自定义一个数据,格式如下:
1656410-7ab85bfcd99032ed.jpeg定义一个待发送的data数据
- mutData 就是最后要传输的数据,存储的是二进制数据,任何地方都适用。
NSString* message = @"Hello World!";
NSData* data = [message dataUsingEncoding:(NSUTF8StringEncoding)];
NSInteger type = 101;
NSMutableData* mutData = [NSMutableData data];
// 1~4字节表示类型
NSData* typeData = [NSData dataWithBytes:&type length:4]; //sizeof(type)
[mutData appendData:typeData];
// 5~8字节表示数据总长度
NSInteger bodyLength = data.length + 4 + 4;
NSData* lengthData = [NSData dataWithBytes:&bodyLength length:4];
[mutData appendData:uuidData];
// 再将文字追加上
[mutData appendData:data];
mutData 可直接传输
解析收到的data数据
- 接收到的二进制数据需要再按字节解析,代码如下(Object-C)
另一个终端接收到了二进制数据data,开始解析
// 1~4字节表示类型
NSInteger type = 0;//一定要给初始值,否则得出的结果是错误的
[data getBytes:&type range:NSMakeRange(0, 4)];
NSLog(@"数据类型: %ld", (long)type);
// 5~8字节表示数据总长度
NSInteger msgLength = 0;//一定要给初始值,否则得出的结果是错误的
[data getBytes:&msgLength range:NSMakeRange(4, 4)];
NSLog(@"数据长度: %ld", (long)msgLength);
NSData* msgData = [data subdataWithRange:NSMakeRange(8, data.length - 8)];
NSString* str = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];
NSLog(@"接收到的消息为:%@", str);
网友评论