楔子
今天项目中有一个需求:给定一个
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