Gunakan <iomanip>
's std::hex
. Jika Anda mencetak, kirimkan saja ke std::cout
, jika tidak, gunakanstd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Anda dapat menambahkan yang pertama <<
dengan << "0x"
atau apa pun yang Anda suka jika Anda mau.
Manip lain yang menarik adalah std::oct
(oktal) dan std::dec
(kembali ke desimal).
Satu masalah yang mungkin Anda temui adalah kenyataan bahwa ini menghasilkan jumlah digit yang tepat yang diperlukan untuk mewakilinya. Anda dapat menggunakan setfill
dan setw
ini untuk menghindari masalah:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Jadi akhirnya, saya menyarankan fungsi seperti itu:
template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
Kornel Kisielewicz
sumber
int
tipe;)std::setw
kebutuhan untuk menjadi output ke aliran untuk setiap int, sedangkanstd::hex
,std::setfill
,std::uppercase
, ... hanya perlu dikirim ke output stream sekali. Ini sepertinya tidak konsisten?Untuk membuatnya lebih ringan dan cepat saya sarankan untuk menggunakan pengisian langsung dari sebuah string.
sumber
double
danfloat
(dan bukan untuk pointer)0000FFFF
untuk0xFFFF
. Saya lebih suka memiliki0xFFFF
sebagai keluaran.Gunakan
std::stringstream
untuk mengubah bilangan bulat menjadi string dan manipulator khususnya untuk mengatur basis. Contohnya seperti itu:sumber
Cetak saja sebagai angka heksadesimal:
sumber
std::cout<<std::hex<<i<<std::dec;
, jika tidak semua bilangan bulat yang dialirkan nanti akan dalam hex. Anda tidak perlu melakukan itu untuk jawaban lain yang digunakanstringstream
karena aliran akan dibuang setelah digunakan, tetapicout
hidup selamanya.Anda dapat mencoba yang berikut ini. Bekerja...
sumber
to_string
adalah bagian dari namespacestd
di C ++ 11Pertanyaan ini sudah lama, tapi saya heran mengapa tidak ada yang menyebutkan
boost::format
:sumber
sumber
Berkat komentar Lincoln di bawah ini, saya telah mengubah jawaban ini.
Jawaban berikut menangani int 8-bit dengan benar pada waktu kompilasi. Itu doees, bagaimanapun, membutuhkan C ++ 17. Jika Anda tidak memiliki C ++ 17, Anda harus melakukan sesuatu yang lain (misalnya memberikan kelebihan beban dari fungsi ini, satu untuk uint8_t dan satu untuk int8_t, atau menggunakan sesuatu selain "if constexpr", mungkin enable_if).
Jawaban asli yang tidak menangani int 8-bit dengan benar seperti yang saya duga:
Jawaban Kornel Kisielewicz bagus. Tetapi sedikit tambahan membantu menangkap kasus di mana Anda memanggil fungsi ini dengan argumen template yang tidak masuk akal (misalnya float) atau yang akan menghasilkan kesalahan compiler yang berantakan (misalnya tipe yang ditentukan pengguna).
Saya telah mengedit ini untuk menambahkan panggilan ke std :: to_string karena tipe integer 8-bit (misalnya
std::uint8_t
nilai yang diteruskan)std::stringstream
diperlakukan sebagai char, yang tidak memberikan hasil yang Anda inginkan. Meneruskan bilangan bulat seperti itu untukstd::to_string
menanganinya dengan benar dan tidak mengganggu saat menggunakan jenis bilangan bulat lain yang lebih besar. Tentu saja Anda mungkin mengalami sedikit penurunan kinerja dalam kasus ini karena panggilan std :: to_string tidak diperlukan.Catatan: Saya baru saja menambahkan ini di komentar ke jawaban asli, tapi saya tidak punya perwakilan untuk berkomentar.
sumber
char
(yang berbeda dari keduanyauint8_t
danint8_t
di sebagian besar implementasi (di mana mereka masing-masingunsigned char
dansigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
dll ...Bagi Anda yang mengetahui bahwa banyak / sebagian besar
ios::fmtflags
tidak berfungsistd::stringstream
namun menyukai ide template yang diposting Kornel dulu, berikut ini berfungsi dan relatif bersih:sumber
Saya melakukan:
Lihatlah jawaban SO dari iFreilicht dan file header template yang diperlukan dari sini GIST !
sumber
Coba lihat solusi saya, [1] yang saya salin kata demi kata dari proyek saya, jadi ada dokumen API Jerman yang disertakan. Tujuan saya adalah menggabungkan fleksibilitas dan keamanan dalam kebutuhan saya yang sebenarnya: [2]
0x
awalan yang ditambahkan: penelepon dapat memutuskanlong long
[1] berdasarkan jawaban Kornel Kisielewicz
[2] Diterjemahkan ke dalam bahasa CppTest , begini bunyinya:
sumber
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Kode untuk referensi Anda:
sumber
clear
yangsstream
(akan hancur ketika kembali fungsi pada baris berikutnya tetap). Anda dapat menghindari penamaanhexStr
sepenuhnya dan hanyareturn sstream.str();
tanpaclear
ing dan mendapatkan efek yang sama, mengurangi empat baris kode menjadi satu.sstream.clear();
? Thesstream
objek secara otomatis hancur pada akhir lingkup, sehinggareturn sstream.str();
akan melakukannya.sstream.clear
hanya akan menghapus konten, sebelum streaming diakhiri dengan cakupan akhir (untuk menghapus tanda kegagalan dan eof dengan menghapus). Memang, ketika ruang lingkup mati, dengan masa hidup variabel-aliran, dan karena itusstream.str
dapat digunakan untuk kembali dengan nilai. [Referensi: cplusplus.com/reference/ios/ios/clear/]Solusi saya. Hanya tipe integral yang diperbolehkan.
Memperbarui. Anda dapat menyetel awalan opsional 0x di parameter kedua.
definisi.h
main.cpp
Hasil:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
sumber
Saya ingin menambahkan jawaban untuk menikmati indahnya bahasa C ++. Kemampuan adaptasinya untuk bekerja pada level tinggi dan rendah. Selamat memprogram.
Contoh:
sumber
Menggunakan void pointer:
Menambahkan 0x:
Keluaran:
sumber
0x69fec4 (alamat)
6946500 (alamat ke dec)
0x69fec4 (alamat ke dec, keluaran dalam hex)
secara naluriah pergi dengan ini ...
int address = (int) & var;
melihat ini di tempat lain ...
alamat panjang tak bertanda tangan = reinterpret_cast (& var);
komentar mengatakan kepada saya bahwa ini benar ...
int address = (int) & var;
berbicara tentang cahaya yang tertutup rapat , di mana Anda berada? mereka mendapatkan terlalu banyak suka!
sumber
unsigned long
tetapistd::intptr_t
.intptr_t
dapat menyimpan pointer apapun pada platform membangun; itu tidak [harus] benarunsigned int
. Dan, sekali lagi, semua ini tidak relevan dengan pertanyaan itu. Tidak ada tanggapan lebih lanjut dari saya