2014-07-24 5 views
0

Примечание: в других вопросах они сравнивают значение, хранящееся в объектах NSData, а не в байтах.Сравните NSData с последовательностью байтов?

Я хочу, чтобы выполнить что-то вроде этого:

NSData *d = ...; 
if (d == "fff1") { 
    ... 
} 

Единственное решение, которое я нашел:

NSData *d = ...; 
NSString *str = [NSString withFormat:@"%@", d]; 
if ([str isEqualToString:@"<fff1>"] { 
    ... 
} 

Но мне не нравится, что мне нужно добавить дополнительные окружающие backets в сравнении. Есть ли лучшие решения?

ответ

2

Для целей сравнения исходных данных используется memcmp:

NSData *dataA; 
void *someBuffer; 
if(memcmp([dataA bytes], someBuffer, dataA.length) == 0) ; //they are the same 

Примечания вы должны смотреть, что длина не слишком велика для любого из буферов.

EDIT: добавленNSDataпроцедура:

Или еще лучше, вы можете преобразовать строку в NSData и сделать сравнение на NSData:

NSData *d = ...; 
    if([d isEqualToData:[NSData dataWithBytes:"fff1" length:sizeof("fff1")]]) { 

    } 
+0

Оба эти способы не работают , – user3798020

+1

Ну, проблема, скорее всего, в том, как вы представляете данные «fff1». Попробуйте выполнить регистрацию [NSData dataWithBytes: "fff1" length: sizeof ("fff1")] и посмотреть, что произойдет. Эти значения символов не имеют ничего общего с тем, что вы сравниваете, как я вижу. Просто удача, почему ваш метод работает, заключается в том, что для метода NSData определен метод описания. Если яблоко изменит этот метод, ваш код перестанет работать. –

+0

Посмотрите на это сообщение: http://stackoverflow.com/questions/7317860/converting-hex-nsstring-to-nsdata –

Смежные вопросы