Поскольку 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) правильным местом для размещения результата. Это зависит от того, куда вы хотите передать числа после их анализа.
person
Peter Hosey
schedule
12.03.2011