2014-02-06 28 views
3

我需要找到我的图像数据中的字节序列。我在java上有下一个代码,但我需要在obj-c中做同样的事情。 的Java:NSData找到字节序列

private static int searchInBuffer(byte[] pBuf, int iBufferLen) { 
    for(int i = 0; i<iBufferLen - 7; i++) { 
     if (pBuf[i] == 'l' && pBuf[i + 1] == 'i' && pBuf[i + 2] == 'n' && pBuf[i + 3] == 'k') 
     return (int)pBuf[i + 4]; 
    } 
    return -1; 
} 

public static int checkFlagInJpeg(String pFullFileName) { 
    int iRes = -1; 
    try { 
     File f = new File(pFullFileName); 
     FileInputStream is = new FileInputStream(f); 
     int iBufferSize = 6 * 1024, iCount = 15; 
     byte buf[] = new byte[iBufferSize]; 

     while((is.available() > 0) && (iCount >= 0)) { 
      int iRead = is.read(buf), 
      iFlag = searchInBuffer(buf, iRead); 
      if (iFlag > 0) { 
       iRes = iFlag; 
       break; 
      } 
      iCount--; 
     } 
     is.close(); 
    } 
} 

的OBJ-C(我的版本):

UIImage *image = [UIImage imageWithCGImage:[[[self.assets objectAtIndex:indexPath.row] defaultRepresentation] fullScreenImage]]; 
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0f); 

    NSUInteger length = MIN(6*1024, [imageData length]); 
    Byte *buffer = (Byte *)malloc(length); 
    memcpy(buffer, [imageData bytes], length); 

    for (int i=0; i < length - 1; i++) { 
     if (buffer[i] == 'l' && buffer[i + 1] == 'i' && buffer[i + 2] == 'n' && buffer[i + 3] == 'k') 
      NSLog(@"%c", buffer[i + 4]); 
    } 
    free(buffer); 

我真不知道,我才明白是字节各方面的工作,所以我需要帮助。

更新: 问题在于获取图像数据。随着马丁·R的帮助,我结合起来,解决方案于一体,并获得下一个工作代码:

ALAssetRepresentation *repr = [[self.assets objectAtIndex:indexPath.row] defaultRepresentation]; 
     NSUInteger size = (NSUInteger) repr.size; 
     NSMutableData *data = [NSMutableData dataWithLength:size]; 

     NSError *error; 
     [repr getBytes:data.mutableBytes fromOffset:0 length:size error:&error]; 

     NSData *pattern = [@"link" dataUsingEncoding:NSUTF8StringEncoding]; 
     NSRange range = [data rangeOfData:pattern options:0 range:NSMakeRange(0, data.length)]; 

     int iRes = -1; 
     if (range.location != NSNotFound) { 
      uint8_t flag; 
      [data getBytes:&flag range:NSMakeRange(range.location + range.length, 1)]; 
      iRes = flag; 
     } 

     NSLog(@"%i", iRes); 

它的工作完美!再次感谢你!

+0

一对夫妇的意见。首先,你的循环应该通过'i Putz1103

+0

不需要memcopy,只需要使用imagedata.bytes,这是一个字节指针到NSData中。 – zaph

+0

此外,您不需要复制数据即可完成此操作。 – trojanfoe

回答

7

NSData有一个方法rangeOfData:...,你可以用它来寻找模式:

NSData *pattern = [@"link" dataUsingEncoding:NSUTF8StringEncoding]; 
NSRange range = [imageData rangeOfData:pattern options:0 range:NSMakeRange(0, imageData.length)]; 

如果发现模式,得到了下一个字节:

int iRes = -1; 
if (range.location != NSNotFound && range.location + range.length < imageData.length) { 
    uint8_t flag; 
    [imageData getBytes:&flag range:NSMakeRange(range.location + range.length, 1)]; 
    iRes = flag; 
} 
+0

谢谢,但它不起作用。 iRes总是-1。但是如果我在文本编辑器中打开我的图像,我可以找到具有“链接”的行。所以也许我需要以某种方式读取UTF8中的imageData? –

+1

@VladislavKovalyov:不是 - 但问题可能是所有的转换资产 - > defaultRepresentation-> fullscreenImage-> UIImageJPEGRepresentation你不一定会得到原始图像数据。 –

+0

那么我如何在没有所有这些转换的情况下获取图像数据?我没有找到任何解决方案。 –