Objective-Cで数値を表す16進文字列を解析する方法を教えてください。私は、目的とCベースの方法のどちらを使用してもかまいません。どちらでもかまいません。
例:
#01FFFFAB
次の整数に解析する必要があります:33554347
何か助けていただければ幸いです!
Objective-Cで数値を表す16進文字列を解析する方法を教えてください。私は、目的とCベースの方法のどちらを使用してもかまいません。どちらでもかまいません。
例:
#01FFFFAB
次の整数に解析する必要があります:33554347
何か助けていただければ幸いです!
回答:
ジョシュアウェインバーグの答えはほぼ正しい0x
ですが、16進整数をスキャンする場合、プレフィックスはオプションです。形式の文字列がある場合#01FFFFAB
でも使用 NSScanner
できますが、最初の文字をスキップできます。
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
0x
(または0X
)で始まっていないことを確認する必要があります。NSScannerはそれらの接頭辞を受け入れます。
これにはNSScannerを使用できます
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];
outVal
あなたが探しているintが含まれます。0xはオプションです。
strtol()はあなたの友達です。
これは文字列をlongに変換し、数値の底を渡すことができます。ただし、最初に#サインオフするか、最初の数値文字へのポインターをstrtolに渡します。
strtol
関数はまた、より寛大です。完全な単体テスト(スペース、16進数以外の文字などを含む)を記述しNSScanner
ます。これにより、より制御しやすい驚くべきエッジケースが見つかります。
以下の行を変換に使用できます。そのたった1行のコード:
NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
ハッピーコーディング!!!
0x
(または0X
)または+/-で始まっていないこと、または入力で有効と見なされないその他の文字がないことを確認してください。
Swift 4標準ライブラリは、すべての整数型を解析するための新しい初期化子を導入しました。文字列を基数(つまり、基数)で解析し、オプションの整数を返します。
let number = Int("01FFFFAB", radix: 16)!
アップルによると:
NSScannerオブジェクトは、NSStringオブジェクトの文字を解釈して、数値および文字列値に変換します。
だから、あなたがNSData
objを持っているなら、あなたは次をすることができます
NSString *dataDescription = data.description;
NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)];
unsigned intData = 0;
NSScanner *scanner = [NSScanner scannerWithString:dataAsString];
[scanner scanHexInt:&intData];
0x
(または0X
)で始まっていないこと、または入力で有効とは見なされないがNSScannerで受け入れられるその他の文字がないことを確認する必要があります。