c++: long to const char*

Theodore Lytras thlytras at gmail.com
Thu Sep 27 16:22:20 EEST 2012


Στις Πεμ 27 Σεπτ 2012, ο/η Tassos Bassoukos έγραψε:
[snip]
> #include <endian.h>
> 
> uint32_t tmp = htole32(<value>);
> device.write(((char*)&tmp),4);
> 
> Προσαρμόζεις το htole32 ανάλογα με το endianess.
> 
> Είμαι σίγουρος ότι μπορείς να τα κάνεις και σε QT με δικές του
> συναρτήσεις/τύπους, απλά δεν το γνωρίζω επαρκώς.
[snip]
> Ελπίζω να βοήθησα,
> Τάσος

Ναι, βοήθησες! Διότι βλέπω οτι χρησιμοποιείς C-style cast και νομίζω πως αυτό 
είναι το κλειδί.

#include <iostream>

int main()
{
  long a = 6513249;
  std::cout << reinterpret_cast<char*>(&a) << std::endl;
}

Δουλεύει, και δίνει output "abc". Άρα ένα cast είναι τελικά η δουλειά. Ούτε 
Qt, ούτε STL, ούτε τίποτα. Δοκίμασα και με static_cast αλλά δε δουλεύει, μόνο 
με reinterpret_cast.

Αυτό βέβαια που αναρρωτιέμαι, είναι τι γίνεται με το \0 που τερματίζει τον 
πίνακα char*. Αν από τα 4 (ή 8) bytes του long χρησιμοποιήσω τα 3 (ή 7), τότε 
προφανώς δεν υπάρχει πρόβλημα. Αν όμως δώσω ένα μεγάλο νούμερο, που να 
χρησιμοποιεί όλα τα bytes, δε θα έχω μετά heap corruption??? Βεβαια από την 
άλλη επειδή το const char * το γράφω μετά στο αρχείο και εκεί γνωρίζω πόσα 
bytes πρέπει να γραφτούν, ίσως και να μην υπάρχει πρόβλημα...

Καλά τα έχω καταλάβει, ή βλακείες λέω??

Ευχαριστώ,

Θοδωρής

-- 
"Beauty is transitory."
"Beauty survives."
        --  Mr. Spock & Capt. Kirk, "That Which Survives", stardate unknown
by Theodore Lytras <thlytras at gmail.com>


More information about the Linux-greek-users mailing list