楔子
今天项目中有一个需求:给定一个NSData *
类型的图片数据,从中解析出图片和图片名称。其中图片数据NSData *
的结构如下:
4个字节的图片名称长度+图片名称+4个字节的图片长度+图片数据
分析
要想解析出图片和图片名称,需要从上述NSData *
类型的图片数据中得到如下四个部分:
- 存储图片名称的字节数
- 图片名称
- 存储图片数据的字节数
- 图片数据
具体实现
假定NSData *imageData
已经从网络中获取到了
- 存储图片名称的字节数
Byte imageNameLengthBytes[4]; [imageData getBytes:imageNameLengthBytes length:4];//获取存储图片名称长度的字节 int imageNameLenth = (int) ((imageNameLengthBytes[0]&0xff) | ((imageNameLengthBytes[1] << 8)&0xff00) | ((imageNameLengthBytes[2]<<16)&0xff0000) | ((imageNameLengthBytes[3]<<24)&0xff000000));//解析出存储图片名称的字节数
- 图片名称
Byte newByte[imageNameLenth]; [imageData getBytes:newByte range:NSMakeRange(4, imageNameLenth)];//获取存储图片名称的字节 NSString *imageName = [[NSString alloc] initWithBytes:newByte length:imageNameLenth encoding:NSUTF8StringEncoding];//解析出图片名称
- 存储图片数据的字节数
Byte imageLengthBytes[4]; [imageData getBytes:imageLengthBytes range:NSMakeRange((4 + imageNameLenth), 4)];//获取存储图片长度的字节 int imageLength = ((imageLengthBytes[0]&0xff) | ((imageLengthBytes[1] << 8)&0xff00) | ((imageLengthBytes[2] << 16)&0xff0000) | ((imageLengthBytes[3] << 24)&0xff000000));//解析出存储图片长度的字节数
- 图片数据
NSData *data = [imageData subdataWithRange:NSMakeRange((8 + imageNameLenth), imageLength)];//获取图片数据
总结
- 从
NSData
中获取指定位置的Byte
,首先想到的方法是可以通过[data bytes]
将整个NSData
转换成Byte
,然后通过for
循环来赋值到指定的Byte
数组中。 - 有更好的方法。
-
getBytes: length
获取从开始位置到指定长度的byte
-
getBytes: range:
获取指定范围的byte
-
- 将
byte
转换为int
型,使用的是先“移位”然后“与”的方法,可以得到对应的值。