[SOLVED] c++: long to const char*
Theodore Lytras
thlytras at gmail.com
Fri Sep 28 09:09:02 EEST 2012
Ευχαριστώ όλους όσοι απάντησαν! Απαντώ σε όλους μαζί στα θέματα που άνοιξε ο
καθένας.
Κατ' αρχήν όχι μόνο δούλεψε, αλλά ήδη ολοκλήρωσα το κομμάτι αυτό της εφαρμογής
μου (export to .dta) άρα όλα καλά. Παραπάνω από καλά!
Η λύση ήταν το reinterpret_cast<char*>(αριθμός), όπως είπα και προηγουμένως.
Θυμίζω οτι η εφαρμογή είναι σε Qt, και θυμίζω επίσης οτι το ζητούμενο ΔΕΝ ήταν
να μετατρέψω τον αριθμό σε ASCII χαρακτήρες για να τον απεικονίσω κάπου
(άλλωστε έχει η Qt μέθοδο γι' αυτό, την QByteArray::number()), αλλά να
αποθηκεύσω τα raw bytes σε ένα binary αρχείο.
Τούτο είναι πρόβλημα όχι γιατί τα bytes θέλουν μετατροπή τα ίδια, αλλά γιατι η
αντίστοιχη fwrite() της Qt (QFile::write()) δέχεται μόνο const char *. Άρα
χρειάζεται μετατροπή το είδος της μεταβλητής, όχι το περιεχόμενό της.
Όντως η λύση του reinterpret_cast<char*> δεν μεταδίδει τον αριθμό σε ένα C-
style string (το κατάλαβα τώρα!). Όμως η QFile::write() δέχεται και ένα
δεύτερο όρισμα για το μέγεθος του const char *, οπότε ακόμη κι αν ο αριθμός
χρησιμοποιεί το τελευταίο byte, θα ξέρει που να σταματήσει και δε θα υπάρξει
heap corruption.
Το ίδιο ισχύει για έναν από τους constructors της QByteArray: δέχεται ένα
const char* και ένα int με το μέγεθος, οπότε θα μπορούσα αν ήθελα να φτιάξω
και null-terminated C-style "strings" (τα εισαγωγικά επειδή μάλλον δε θα έχει
εκτυπώσιμους χαρακτήρες). Η QByteArray θα έκανε deep-copy τον casted αριθμό
και θα πρόσθετε και το \0 στο τέλος.
Τέλος σε ότι αφορά το endianness, η αποθήκευση των bytes στο αρχείο πρέπει να
γίνει little endian (βάσει των docs του file format), και αφού οι CPU που
χρησιμοποιούμε σχεδόν όλοι είναι little endian, όλα καλά. Παρ' όλα αυτά για
την περίπτωση που η εφαρμογή μου κυριεύσει τον κόσμο και θελήσει κάποιος να
την τρέξει σε PowerPC (:-) ), υπάρχει στην Qt η συνάρτηση qToLittleEndian()
που κάνει τη μετατροπή εφ'όσον ο κώδικας τρέχει σε big-endian αρχιτεκτονική.
Τύλιξα μ'αυτή όλους τους αριθμούς που θέλω να αποθηκεύσω στο αρχείο, οπότε δε
θα έχω πρόβλημα υποθέτω.
Α, και σε ότι αφορά το μήκος των αριθμών, άλλαξα όλους τους long σε quint32
που η Qt εγγυάται οτι θα έχουν 4-byte μήκος σε όλες τις υποστηριζόμενες
πλατφόρμες.
Σαν η απάντηση να μετατράπηκε σε διαφήμιση της Qt, δε νομίζετε?? ;-)
Anyway, και πάλι ευχαριστώ όλους! Βγήκα και πάλι σοφότερος από τη συζήτηση
μαζί σας.
Θοδωρής
--
"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