Преобразование int64 в NSData
-
21-08-2019 - |
Вопрос
Мне нужно преобразовать длинное значение из 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 через [байты буфера], а не его значение?
Решение
У вас есть две основные проблемы:во-первых, ваше число слишком велико для того времени, на которое вы его разыгрываете.Вместо 9000000000000000000L
тебе следовало бы 9000000000000000000LL
чтобы указать длинную константу long.
Во-вторых, вы правильно ответили на свой вопрос, вы распечатываете адрес.Замените вашу строку NSLog на с этой строкой:
NSLog(@"%lld", *((int64_t*)[buffer bytes]));
и вы должны увидеть результат, которого вы ожидаете.