অবজেক্ট-সি পূর্ণসংখ্যা থেকে হেক্স স্ট্রিং পার্স করুন


94

আমি জানতে চাই যে কীভাবে একটি সংখ্যাকে উপস্থাপন করে একটি হেক্স স্ট্রিং পার্স করতে হবে, উদ্দেশ্য-সিতে number আমি উদ্দেশ্য বা সি-ভিত্তিক পদ্ধতি উভয়ই ব্যবহার করতে ইচ্ছুক, না হয় ভাল।

উদাহরণ:

#01FFFFAB

পূর্ণসংখ্যায় পার্স করা উচিত: 33554347

কোন সাহায্য প্রশংসা হবে!

উত্তর:


169

জোশুয়া ওয়েইনবার্গের উত্তর বেশিরভাগ ক্ষেত্রে সঠিক, তবে 0xহেক্সাডেসিমাল পূর্ণসংখ্যা স্ক্যান করার সময় উপসর্গটি alচ্ছিক। আপনার যদি ফর্ম্যাটে একটি স্ট্রিং থাকে তবে #01FFFFABআপনি এখনও ব্যবহার NSScannerকরতে পারেন তবে আপনি প্রথম অক্ষরটি এড়িয়ে যেতে পারেন।

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];

4
ধন্যবাদ, ঠিক আমার যা দরকার ছিল!
রিচার্ড জে। রস তৃতীয়

মনে রাখবেন যে আপনি যদি কঠোরভাবে বিশ্লেষণ করতে চান তবে আপনার প্রথমে পরীক্ষা করা উচিত যে স্ট্রিংটি 0x(বা 0X) দিয়ে শুরু হচ্ছে না । এনএসএস স্ক্যানার সেই উপসর্গগুলি গ্রহণ করবে।
ক্রিস পৃষ্ঠা

63

আপনি এটির জন্য এনএসএস স্ক্যানার ব্যবহার করতে পারেন

unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];

outValআপনি যা খুঁজছেন তা অন্তর্ভুক্ত করবে। 0x .চ্ছিক।


4
এছাড়াও, আপনি # অক্ষরটিকে 0x উপসর্গে রূপান্তর করতে একটি স্ট্রিং বিকল্প ব্যবহার করতে পারেন।
হটপাউ 2

স্বাক্ষরবিহীন ইন্ট আউটভাল হওয়া উচিত;
Wanghq

12

strtol () আপনার বন্ধু।

এটি একটি স্ট্রিংকে একটি দীর্ঘকে রূপান্তরিত করে এবং আপনি সংখ্যার ভিত্তিটি পাস করতে পারেন that তবে এই # সাইনটি প্রথমে বন্ধ করুন, অথবা প্রথম সংখ্যার অক্ষরে একটি পয়েন্টারকে স্ট্র্টল দিয়ে দিন।


4
আমি এই পদ্ধতিটি নিয়ে চলেছি, এনএসকেকারার বরাদ্দের চেয়ে সহজতর (এবং সম্ভাব্য দ্রুত)।
ক্রিস

4
@ ক্রিস: আপনার কোনও এনএসএসস্ট্রিং থাকলে সম্ভবত এটি তাত্ক্ষণিক নয়, কারণ স্ট্র্টল ব্যবহারের আগে আপনাকে এনএসএসটিংকে সি স্ট্রিংয়ে রূপান্তর করতে হবে। যদি আপনার কাছে ইতিমধ্যে সি স্ট্রিংটিতে পাঠ্য রয়েছে, তবে এটি সম্ভবত দ্রুততর হবে তবে আপনি যদি হাজার হাজার বা কয়েক মিলিয়ন বার এটি না করেন তবে আমি সন্দেহ করি যে আপনি পারফরম্যান্সটির হিট অনুভব করবেন।
স্বপ্নের

4
int res = strtol ([আপনার স্ট্রিং ইউটিএফ 8 স্ট্রিং], নুল, বেস)
loretoparisi

4
@ ড্রিমলাক্স এর সংজ্ঞা - [এনএসএসআরটিং ইউটিএফ 8 স্ট্রিং] দেখায় যে এটি ব্যাকিং ইউটিএফ 8 সি স্ট্রিং (এনএসপিটারেএনপিএনইএনআর_পিআরএনটার) এ একটি পয়েন্টার দেয়। একটি উচ্চ স্তরে, এনএসএসকেনারের জন্য মেমরি বরাদ্দের ওভারহেডের বিপরীতে এই কনস্টের চর পয়েন্টারটি ফিরিয়ে আনার জন্য কেবল একক ক্রিয়াকলাপ, এনএসএসটিং ইনপুট প্যারামিটার অনুলিপি করা, প্রতিটি ওজেসি পদ্ধতিতে অনুরোধের সাথে অতিরিক্ত ওবজিসি বার্তা-পাসিং ল্যাটেন্সির উল্লেখ না করা। এটি স্ট্রিটল () ব্যবহারের জন্য অ্যালগরিদমিকভাবে অনেক দ্রুত, তবে আপনি লক্ষ লক্ষ স্ট্রিং থেকে হেক্স সংখ্যার স্ক্যানিং স্ক্যান করতে না পারলে আপনি সম্ভবত এই পার্থক্যটি লক্ষ্য করবেন না :-)
জ্যাকব

4
strtolফাংশন এছাড়াও আরো অনেক কোমল হয়। লিখন পুঙ্খানুপুঙ্খ ইউনিট পরীক্ষা (স্পেস, অ হেক্স অক্ষর, ইত্যাদি .. অন্তর্ভুক্ত করুন) যেমন আপনি কিছু বিস্ময়কর প্রান্ত যে মামলাগুলি পাবেন NSScannerআপনি আরো উপর নিয়ন্ত্রণ দেয়।
কুইন্টিন উইলিসন

5

রূপান্তর করার জন্য আপনি নীচের লাইনটি ব্যবহার করতে পারেন। এটি কেবল একটি লাইন কোড:

NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);

শুভ কোডিং !!!


মনে রাখবেন যে আপনি যদি কঠোরভাবে বিশ্লেষণ করতে চান তবে আপনার প্রথমে পরীক্ষা করে নেওয়া উচিত যে স্ট্রিংটি 0x(বা 0X) বা +/- দিয়ে শুরু হয় না বা অন্য কোনও অক্ষর যা আপনার ইনপুটটিতে বৈধ বলে মনে করা হয় না।
ক্রিস পৃষ্ঠা

2

সুইফট 4 স্ট্যান্ডার্ড লাইব্রেরি সমস্ত পূর্ণসংখ্যার ধরণের পার্সিংয়ের জন্য নতুন প্রারম্ভিক চালু করেছে। এটি রেডিক্স (অর্থাত্ বেস) দিয়ে পার্স করতে স্ট্রিং নেয় এবং optionচ্ছিক পূর্ণসংখ্যার ফেরত দেয়:

let number = Int("01FFFFAB", radix: 16)!

@ এমজারাগোজা আমি কিছু ব্যাখ্যা যুক্ত করেছি
আলেকজান্ডার ভ্যাসেনিন

0

আপেল অনুসারে:

একটি এনএসএস স্ক্যানার অবজেক্ট একটি এনএসএসআর্টিং অবজেক্টের অক্ষরকে সংখ্যা এবং স্ট্রিংয়ের মানগুলিতে রূপান্তর করে এবং রূপান্তর করে।

সুতরাং, আপনার NSDataআপত্তি থাকলে আপনি পরবর্তী কাজ করতে পারেন

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) বা অন্য কোনও অক্ষর দিয়ে শুরু হয় না যা আপনার ইনপুটটিতে বৈধ বলে মনে করা হয় না তবে এনএসএস স্ক্যানার দ্বারা স্বীকৃত।
ক্রিস পেজ

0

সুইফট 3 এর জন্য:

var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.