2012-01-15 91 views
1

我有一個NSData的字節從我想要減去一個字符串。該NSData對象看起來像這樣從iOS上的二進制NSData減去字符串

01 00 00 04 40 00 00 00 00 41 41 41 41 48 47 5A 30 65 58 42 4E 4E 45 45 67 41 
41 41 41 41 45 30 30 51 53 42 74 63 44 51 79 61 58 4E 76 62 51 41 41 41 2B 39 
74 62 32 39 32 41 41 41 41 62 47 31 32 61 47 51 41 41 41 41 41 71 67 59 35 79 
36 6F 47 4F 63 73 41 41 4B 78 45 41 41 43 34 41 41 41 42 41 41 41 42 41 41 41 
41 41 41 41 41 41 41 41 41 41 41 41 41 41 51 41 41 41 41 41 41 41 41 41 41 41 

我想從「40 00 00 00」中第一次出現解壓一切「34」

我怎麼能做到這一點的第一次出現?

由於

果渣

回答

2

不確定的哪些字節要,這裏被提取的範圍內的數據「40 00 00 00」之間,以「34」的第一次出現,並與該範圍中刪除的數據:

const NSUInteger dataLength = 130; 
unsigned char dataBytes[dataLength] = { 
0x01,0x00,0x00,0x04,0x40,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x48,0x47,0x5A, 
0x30,0x65,0x58,0x42,0x4E,0x4E,0x45,0x45,0x67,0x41,0x41,0x41,0x41,0x41,0x45,0x30, 
0x30,0x51,0x53,0x42,0x74,0x63,0x44,0x51,0x79,0x61,0x58,0x4E,0x76,0x62,0x51,0x41, 
0x41,0x41,0x2B,0x39,0x74,0x62,0x32,0x39,0x32,0x41,0x41,0x41,0x41,0x62,0x47,0x31, 
0x32,0x61,0x47,0x51,0x41,0x41,0x41,0x41,0x41,0x71,0x67,0x59,0x35,0x79,0x36,0x6F, 
0x47,0x4F,0x63,0x73,0x41,0x41,0x4B,0x78,0x45,0x41,0x41,0x43,0x34,0x41,0x41,0x41, 
0x42,0x41,0x41,0x41,0x42,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 
0x41,0x41,0x41,0x41,0x41,0x41,0x51,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 
0x41,0x41}; 
NSData *data = [NSData dataWithBytes:dataBytes length:130]; 

const NSUInteger startBytesLength = 4; 
unsigned char startBytes[startBytesLength] = {0x40, 0x00, 0x00, 0x00}; 
const NSUInteger stopBytesLength = 1; 
unsigned char stopBytes[stopBytesLength] = {0x34}; 


NSData *startData = [NSData dataWithBytes:startBytes length:startBytesLength]; 
NSData *stopData = [NSData dataWithBytes:stopBytes length:stopBytesLength]; 
NSRange startRange = [data rangeOfData:startData options:0 range:NSMakeRange(0, dataLength)]; 
NSUInteger start = startRange.location; 

NSRange stopRange = [data rangeOfData:stopData options:0 range:NSMakeRange(start+startBytesLength, dataLength-(start+startBytesLength))]; 
NSUInteger length = stopRange.location - start; 
NSUInteger stopLocation = stopRange.location+stopBytesLength; 

NSData *extractData = [data subdataWithRange:NSMakeRange(start, length)]; 
NSLog(@"extractData: %@", extractData); 

NSMutableData *newData = [NSMutableData data]; 
[newData appendData:[data subdataWithRange:NSMakeRange(0, start)]]; 
[newData appendData:[data subdataWithRange:NSMakeRange(stopLocation, dataLength-stopLocation)]]; 
NSLog(@"newData: %@", newData); 

的NSLog輸出:

ExtractData由:< 00414141 4148475a 3065 5842 4e4e4545 67414141 41414530 30515342 74634451 7961584e 76625141 41412b39 74623239 32414141 41624731 32614751 41414141 41716759 3579366f 474f6373 41414b78 45414143>

newData: 41414141 41514141 41414141 41414141 41>

+0

第一輸出是我需要的('extractData')。它精確地提取了我需要的內容,但是在函數的末尾崩潰(對象0xbfffd6cf的malloc:***錯誤:釋放的指針未分配)。你知道它是什麼嗎? – Marc 2012-01-16 09:04:32

+0

在'startData'和'stopData'聲明中加入'freeWhenDone:NO'解決了這個問題。 – Marc 2012-01-17 18:27:47

+0

糟糕,我不應該使用NoCopy版本,它需要使用malloc分配字符數組。固定。 – zaph 2012-01-17 23:37:39