2012-02-10 3 views
2

Мне нужно преобразовать значения, такие как 1393443048683555715 в HEX. Но, в первую очередь, я не могу показать его как десятичное с помощью NSLog(), например.Работа с большими числами в Objective-C?

Хорошо, это работает:

NSLog(@"%qu", 1393443048683555706); 

Но что о преобразовании в HEX. Какой тип я должен использовать, чтобы сохранить это большое значение?

NSLog([NSString stringWithFormat: @"%x", 1393443048683555706]); 
// result eb854b7a. It's incorrect result! 

, но я забыл сказать, что это большое число, представленное в виде строки @ «1393443048683555706» (не Int)

+0

Почему бы не преобразовать его в строку? –

+0

Поскольку все числа находятся в двоичной форме, я думаю, вам нужно строковое представление числа в шестнадцатеричном формате, правильно? Что относительно '[NSString stringWithFormat: @"% x ", someInteger]'? – Costique

+0

дает неверный результат – leaf

ответ

1

«X» спецификатор формата для 32-разрядных чисел; вам нужно использовать «qx» или «qX» (в зависимости от того, хотите ли вы, чтобы значения букв были прописными или нет). Это форматтеры для беззнаковых длинных длинных значений, см:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1

Далее, вы не должны передавать строку, как вы сделали выше, непосредственно NSLog - это может привести к аварии.

NSLog(string); // bad!! 
NSLog(@"%@", string); // good 

Так что, если ваше значение приходит в виде строки, вы хотите сделать это:

NSString *longNumber = @"1393443048683555706"; 
NSLog(@"%qx", [longNumber longLongValue]); 

Если строковое значение не может быть принужден к ряду, longLongValue возвратит 0. I 'll оставить его вам справиться с ошибкой (и границ) проверки - см. NSString для деталей.

Если вы хотите сохранить шестнадцатеричное значение в виде строки, выполните следующие действия:

NSString *hexRepresentation = [NSString stringWithFormat:@"%qx", [longNumber longLongValue]]; 

Опять же, лучше позаботиться для обработки ошибок.

+0

thanq. идеальный ответ :) – leaf

2

Вы можете использовать %qi и формат %qu определители с NSLog для отображения 64-разрядных целых чисел. Ваш постоянный появляется, чтобы вписаться в 64-разрядное числе, с границами:

[−9223372036854775808 to 9223372036854775807]