Поскольку CRD уже проделал хорошую работу, чтобы показать вам правильное решение, я воспользуюсь своим ответом, чтобы объяснить, почему ваши решения не сработали.
unsigned char key[16];
memset(key, 0, sizeof(key));
sscanf(deskey, "%o %o %o %o %o %o %o %o",
(int*)&key[0], (int*)&key[1], (int*)&key[2],
(int*)&key[3], (int*)&key[4], (int*)&key[5],
(int*)&key[6], (int*)&key[7]);
Ложьчтобы компилятор никогда не решал проблемы.
key
- это массив unsigned char
s.Указание компилятору при вызове функции на sscanf
, что ваши указатели на массив являются указателями на int
s, не делает их такими;хранилище, на которое указывает каждый из них, по-прежнему является хранилищем для unsigned char
, и не более.
Результатом этого является то, что каждая попытка сохранить один int
по указанному вами адресу перезаписывает три четвертипредыдущий int
.Результат того, что состоит в том, что sscanf
представляет собой чуть более сложный способ сделать то же самое, что и memset
.
Я говорю «немного больше», а не «не более »по причине: вызов sscanf
также записывает sizeof(int) - sizeof(unsigned char)
байт за пределы конца массива, поэтому вы также разбиваете стек и настраиваетесь на возможный сбой.
if ([scanner scanInt:&pos]) {
[enckey addObject:[NSString stringWithFormat:@"%o", pos]];
scanInt:
анализирует число из строки в десятичном виде.stringWithFormat:
также делает то, что говорит его имя: он создает строку.В указанном вами формате он преобразует число в строку, а не наоборот.
Таким образом, вы используете scanInt:
для анализа числа в десятичном формате и stringWithFormat:
для преобразования его в восьмеричное(и закодировать его обратно в строку).Предполагая, что из кода на основе sscanf
, что ввод был в восьмеричном виде, это противоположно тому, что вы хотите.
Этот код, безусловно, даст вам цифры, но даст неправильные числа, которыепочти так же плохо, как код sscanf
, который дал вам все нули плюс сбой.
Вы не можете использовать NSScanner для сканирования восьмеричных чисел.
Я также не уверен, почему вы назвали этопеременная pos
, поскольку она не является позицией.Конечно, это не то, что scanInt:
дает вам.
Мне удалось отсканировать строку и вытащить числа, но я не уверен, как сохранить их в NSData после этого.
См. документацию NSData .
Я пытался использовать NSMutableArray и NSData, но безуспешно.
Ничего не имеетсделать с проблемой, которая заключается в разборе входных данных.
Я не уверен, будет ли NSArray или массив C (последний необязательно заключен в NSData) правильным местом для размещения результата.Это зависит от того, куда вы хотите передать числа после их анализа.