নীচে লিংকনের মন্তব্যে ধন্যবাদ, আমি এই উত্তরটি পরিবর্তন করেছি।
নিম্নলিখিত উত্তরগুলি সংকলনের সময় 8-বিট ইনটগুলি সঠিকভাবে পরিচালনা করে। এটি doees, তবে, সি ++ 17 প্রয়োজন। আপনার যদি সি ++ 17 না থাকে তবে আপনাকে অন্য কিছু করতে হবে (উদাঃ এই ফাংশনটির ওভারলোডগুলি, একটি uint8_t এর জন্য এবং একটি int8_t এর জন্য, বা "যদি কনস্টেক্সপ্রে", সম্ভবত সক্ষম_আইফ) এর বাইরে কিছু ব্যবহার করুন)।
template< typename T >
std::string int_to_hex( T i )
{
// Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher.
static_assert(std::is_integral<T>::value, "Template argument 'T' must be a fundamental integer type (e.g. int, short, etc..).");
std::stringstream stream;
stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2) << std::hex;
// If T is an 8-bit integer type (e.g. uint8_t or int8_t) it will be
// treated as an ASCII code, giving the wrong result. So we use C++17's
// "if constexpr" to have the compiler decides at compile-time if it's
// converting an 8-bit int or not.
if constexpr (std::is_same_v<std::uint8_t, T>)
{
// Unsigned 8-bit unsigned int type. Cast to int (thanks Lincoln) to
// avoid ASCII code interpretation of the int. The number of hex digits
// in the returned string will still be two, which is correct for 8 bits,
// because of the 'sizeof(T)' above.
stream << static_cast<int>(i);
}
else if (std::is_same_v<std::int8_t, T>)
{
// For 8-bit signed int, same as above, except we must first cast to unsigned
// int, because values above 127d (0x7f) in the int will cause further issues.
// if we cast directly to int.
stream << static_cast<int>(static_cast<uint8_t>(i));
}
else
{
// No cast needed for ints wider than 8 bits.
stream << i;
}
return stream.str();
}
আসল উত্তর যা 8-বিট ইনটগুলি সঠিকভাবে পরিচালনা করে না যেমনটি আমি ভেবেছিলাম:
কর্নেল কিসিলেউইচকের উত্তর দুর্দান্ত। তবে সামান্য সংযোজন এমন ঘটনাগুলি ধরতে সহায়তা করে যেখানে আপনি এই ফাংশনটিকে টেমপ্লেট আর্গুমেন্টগুলির সাথে কল করছেন যা বুদ্ধিমান নয় (উদাহরণস্বরূপ ফ্লোট) বা এর ফলে অগোছালো সংকলক ত্রুটির (যেমন ব্যবহারকারী-সংজ্ঞায়িত প্রকার) হতে পারে।
template< typename T >
std::string int_to_hex( T i )
{
// Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher.
static_assert(std::is_integral<T>::value, "Template argument 'T' must be a fundamental integer type (e.g. int, short, etc..).");
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
// Optional: replace above line with this to handle 8-bit integers.
// << std::hex << std::to_string(i);
return stream.str();
}
আমি স্টাড :: টু স্ট্রিংয়ে একটি কল যুক্ত করার জন্য এটি সম্পাদনা করেছি কারণ ৮-বিট পূর্ণসংখ্যার ধরণের (যেমন std::uint8_t
মানগুলি উত্তীর্ণ হয়েছে) std::stringstream
চর হিসাবে বিবেচনা করা হবে, যা আপনাকে চান ফলাফল দেয় না। std::to_string
এগুলি পূর্ণসংখ্যাগুলি সঠিকভাবে পরিচালনা করতে দেয় এবং অন্যান্য, বৃহত্তর পূর্ণসংখ্যার প্রকারগুলি ব্যবহার করার সময় জিনিসগুলিকে আঘাত করে না। অবশ্যই এই ক্ষেত্রে আপনি সম্ভবত একটি সামান্য পারফরম্যান্সের আঘাতের শিকার হতে পারেন যেহেতু std :: to_string কল অপ্রয়োজনীয়।
দ্রষ্টব্য: আমি কেবলমাত্র মূল উত্তরের মন্তব্যে এটি যুক্ত করতে পারতাম, তবে আমার কাছে মন্তব্য করার মতামত নেই।
int