Что такое мои данные? - PullRequest
       3

Что такое мои данные?

0 голосов
/ 07 июня 2011

Я получаю NSData * и пытаюсь получить его побайтно, но данные заполнены f.

NSData *Data = getData();
cout << "The log way:" << endl;
NSLog(@"%@", Data);
cout << "The data way:" << endl;
char *data = (char *)[Data bytes];
for(int i = 0; i < [Data length]; i++)
{
    cout.width(2);
    cout.fill(0);
    cout << hex << (int)(data[i]) << " ";
}
cout << endl;

Что я получаю в качестве вывода:

The log way:
/* something long about time and file */<1f9cb0f8>
The data way:
1f ffffff9c ffffffb0 fffffff8

Как я могу получить эти данные как int с без всех этих f?

Ответы [ 2 ]

4 голосов
/ 07 июня 2011

Тип данных char имеет неопределенную подпись, и, похоже, ваш компилятор (gcc или clang?) Решил, что он должен быть подписан.Поэтому, когда вы приводите char к большему типу, используется расширение знака, которое заполняет дополнительные биты тем же значением, которое имеет старший значащий бит.Для байтов со значением, большим 0x7F, устанавливается старший значащий бит, поэтому он прерывает увеличение.

Требуется нулевое расширение, которое обнуляет дополнительные биты.Вы можете получить его, используя тип unsigned char.

Это должно сделать это:

unsigned char *data = (unsigned char *)[Data bytes];

Кстати, -[NSData bytes] возвращает указатель const.Вы должны соблюдать это и пометить указатель как const тоже:

const unsigned char *data = (const unsigned char *)[Data bytes];
0 голосов
/ 07 июня 2011

Это данные в виде целых чисел, вроде. Данные разбиты на байты и расширены до целых. В байтах ваши данные 1f 9c b0 f8. 9c, b0 и f8 - все отрицательные, поэтому они расширяют знак, делая дополнительные биты равными 1, поэтому вы получаете кучу f s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...