नीचे लिंकन की टिप्पणी के लिए धन्यवाद, मैंने इस उत्तर को बदल दिया है।
निम्नलिखित उत्तर संकलन समय पर 8-बिट ints को ठीक से संभालता है। हालांकि, इसके लिए C ++ 17 की आवश्यकता होती है। यदि आपके पास C ++ 17 नहीं है, तो आपको कुछ और करना होगा (जैसे कि इस फ़ंक्शन के ओवरलोड प्रदान करते हैं, एक uint8_t के लिए और एक int8_t के लिए, या "अगर कॉन्स्ट्रेक्स" के अलावा कुछ का उपयोग करें, तो enable_if)।
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-बिट इन्टल्स को सही ढंग से हैंडल नहीं करता है जैसा कि मैंने सोचा था कि यह किया था:
Kornel Kisielewicz का जवाब बहुत अच्छा है। लेकिन एक मामूली जोड़ उन मामलों को पकड़ने में मदद करता है, जहां आप इस फ़ंक्शन को टेम्प्लेट तर्कों के साथ बुला रहे हैं जो समझ में नहीं आते हैं (उदाहरण के लिए फ्लोट) या जिसके परिणामस्वरूप गन्दा संकलक त्रुटियां (जैसे उपयोगकर्ता-परिभाषित प्रकार) होगी।
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 :: to_string में कॉल जोड़ने के लिए संपादित किया है क्योंकि 8-बिट पूर्णांक प्रकार (जैसे std::uint8_t
मान पारित) को std::stringstream
चार के रूप में माना जाता है, जो आपको इच्छित परिणाम नहीं देता है। ऐसे पूर्णांकों को पास करना, std::to_string
उन्हें सही तरीके से संभालना और अन्य, बड़े पूर्णांक प्रकारों का उपयोग करते समय चीजों को नुकसान नहीं पहुंचाता है। निश्चित रूप से आप संभवतः इन मामलों में एक मामूली प्रदर्शन को प्रभावित कर सकते हैं क्योंकि std :: to_string कॉल अनावश्यक है।
नोट: मैंने इसे मूल उत्तर की टिप्पणी में जोड़ा होगा, लेकिन मेरे पास टिप्पणी करने के लिए रिपीट नहीं है।
int
टाइप पर अपने सुझाव का परीक्षण करें ;)