Преобразование int64 в NSData - PullRequest
3 голосов
/ 11 мая 2009

Мне нужно преобразовать длинное значение из int64 в NSData, чтобы позже я смог запустить алгоритм хэширования для него. Я выполняю:

int64_t longNumber = 9000000000000000000L;
NSMutableData *buffer = [NSMutableData dataWithBytes:&longNumber length:sizeof(longNumber)];

NSLog(@"%lld", [buffer bytes]);
NSLog(@"%lld", longNumber);

Результирующий вывод консоли выглядит следующим образом:

6201314301187184 9000000000000000000

Почему NSData неправильно хранит значение длинного числа? Если я запускаю это в цикле, байты NSData смещаются, начиная с 620, затем 621 и далее. Выводит ли я адрес longNumber через [буферные байты], а не его значение?

1 Ответ

7 голосов
/ 11 мая 2009

У вас есть две основные проблемы: во-первых, ваш номер слишком велик для того времени, на которое вы его используете. Вместо 9000000000000000000L у вас должно быть 9000000000000000000LL для обозначения длинной длинной константы.

Во-вторых, вы правильно ответили на свой вопрос, вы распечатываете адрес. Замените вашу строку NSLog на эту строку:

NSLog(@"%lld", *((int64_t*)[buffer bytes]));

и вы должны увидеть ожидаемый результат.

...