Saya ingin mengonversi string heks menjadi integer bertanda 32 bit di C ++.
Jadi, misalnya, saya punya string hex "fffefffe". Representasi biner dari ini adalah 11111111111111101111111111111110. Representasi integer yang ditandatangani adalah: -65538.
Bagaimana saya melakukan konversi ini di C ++? Ini juga perlu berfungsi untuk angka non-negatif. Misalnya, string hex "0000000A", yaitu 000000000000000000000000000000101010 dalam biner, dan 10 dalam desimal.
int
. "32 bit integer ditandatangani" bisa int32_t atau __int32 dll.Jawaban:
menggunakan
std::stringstream
contoh berikut menghasilkan
-65538
sebagai hasilnya:Dalam standar C ++ 11 yang baru, ada beberapa fungsi utilitas baru yang dapat Anda manfaatkan! khusus, ada keluarga fungsi "string ke nomor" ( http://en.cppreference.com/w/cpp/string/basic_string/stol dan http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Ini pada dasarnya adalah pembungkus tipis di sekitar string C ke fungsi konversi angka, tetapi tahu bagaimana menangani a
std::string
Jadi, jawaban paling sederhana untuk kode yang lebih baru mungkin akan terlihat seperti ini:
CATATAN: Di bawah ini adalah jawaban asli saya, yang seperti yang diedit mengatakan bukan jawaban yang lengkap. Untuk solusi fungsional, tempel kode di atas baris :-).
Tampaknya sejak
lexical_cast<>
didefinisikan memiliki semantik konversi aliran. Sayangnya, stream tidak mengerti notasi "0x". Jadiboost::lexical_cast
tangan saya yang digulung tidak cocok dengan string hex. Solusi di atas yang secara manual mengatur input stream ke hex akan menanganinya dengan baik.Boost juga memiliki beberapa hal untuk dilakukan, yang juga memiliki beberapa kemampuan pengecekan kesalahan yang bagus. Anda bisa menggunakannya seperti ini:
Jika Anda merasa tidak ingin menggunakan boost, inilah versi ringan dari pemeran leksikal yang tidak memeriksa kesalahan:
yang dapat Anda gunakan seperti ini:
sumber
std::hex
stringstream
satu orang harus memeriksass.good() && ss.eof()
untuk memastikan tidak ada kesalahan terjadi.Untuk metode yang bekerja dengan C dan C ++, Anda mungkin ingin mempertimbangkan untuk menggunakan strtol fungsi pustaka standar ().
sumber
strtoul
tidak menggunakannyastrtol
. Akan ada+ overflow
saat menggunakan strtol. Denganstrtoul
tidak akan ada overflow dan nilai yang dikembalikan akan dikonversi kelong
untuk menghasilkan hasil yang benar (-65538). Jadi jawaban Anda hampir benar :)Andy Buchanan, sejauh menempel pada C ++, saya menyukai milik Anda, tetapi saya memiliki beberapa mod:
Digunakan seperti
Dengan begitu Anda tidak perlu satu impl per tipe int.
sumber
Contoh kerja dengan
strtoul
adalah:strtol
dikonversistring
kelong
. Di komputer sayanumeric_limits<long>::max()
memberi0x7fffffff
. Jelas itu0xfffefffe
lebih besar dari0x7fffffff
. Jadistrtol
mengembalikanMAX_LONG
bukan nilai yang diinginkan.strtoul
mengkonversistring
keunsigned long
itu sebabnya tidak ada kelebihan dalam hal ini.Ok,
strtol
sedang mempertimbangkan string input bukan sebagai integer bertanda 32-bit sebelum konversi. Sampel lucu denganstrtol
:Kode di atas dicetak
-65538
di konsol.sumber
Inilah metode sederhana dan kerja yang saya temukan di tempat lain:
Harap dicatat bahwa Anda mungkin lebih suka menggunakan bilangan bulat panjang / bilangan bulat panjang, untuk menerima nilai. Catatan lain, fungsi c_str () baru saja mengubah std :: string menjadi const char *.
Jadi, jika Anda memiliki const char * siap, langsung saja menggunakan nama variabel itu secara langsung, seperti yang ditunjukkan di bawah ini [Saya juga menunjukkan penggunaan variabel panjang yang tidak ditandai untuk nomor hex yang lebih besar. Jangan bingung dengan kasus memiliki const char * bukannya string]:
Ini berfungsi baik-baik saja (asalkan Anda menggunakan tipe data yang sesuai sesuai kebutuhan Anda).
sumber
Saya memiliki masalah yang sama hari ini, inilah cara saya menyelesaikannya sehingga saya dapat menyimpan lexical_cast <>
(Menemukan halaman ini ketika saya sedang mencari cara yang kurang sial :-)
Ceria, A.
sumber
Ini bekerja untuk saya:
sumber
Coba ini. Solusi ini agak berisiko. Tidak ada cek. String hanya harus memiliki nilai hex dan panjang string harus cocok dengan ukuran tipe pengembalian. Tetapi tidak perlu header ekstra.
Pemakaian:
Catatan: panjang string harus dapat dibagi 2
sumber