iOS从NSData中解析Byte型数据

楔子

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