Örnek
Elimizde şöyle bir bellek olsun.
Elimizde şöyle bir bellek olsun.
char* p = ...;
Şöyle yaparız.std::int32_t v = *reinterpret_cast<std::int32_t*>(p);
Örnek - binary dosyaya yazma/okuma işlemlerireinterpret_cast'in en çok işe yaradığı noktalardan birisi, bir POD nesneyi dosyaya yazma. Nesne char*
tipine cast ediliyor. Elimizde şöyle bir sınıf olsun
Bu sınıfı dosyaya yazmak için şöyle yaparızclass PhoneBook{public:PhoneBook(int=0,const std::string & = "", conststd::string & = "", const std::string & = "");void setId(int);int getId() const;void setFirstName(const std::string &);std::string getFirstName() const;void setLastName(const std::string &);std::string getLastName() const;void setPhone(const std::string &);std::string getPhone() const;std::string toString() const;private:int id;char firstName[10];char lastName[10];char phone[10];};
const string fileName = "phonebook.dat";void create(){ofstream file(fileName, ios::out|ios::app|ios::binary);PhoneBook pb;...file.write(reinterpret_cast<const char *>(&pb), sizeof(PhoneBook));}
Dosyada bulmak için şöyle yaparız
Örnekconst string fileName = "phonebook.dat";PhoneBook findById(int id){ifstream file(fileName, ios::binary);PhoneBook pb;while(file.read(reinterpret_cast<char *>(&pb),sizeof (PhoneBook))){if(pb.getId()==id) {break;}}return pb;}
Elimizde şöyle bir kod olsun
Public olmayan alanlara erişmek için şöyle yaparız.class Foo { public: int m_Foo; // Completely vulnerable and dangerous protected: int m_Bar; // Possible attack vector from subclasses private: int m_FooBar; // Totally secure };
Aynı şeyi offset ile de yapabiliriz. Şöyle yaparız.struct PublicFoo { int m_Foo; int m_Bar; int m_FooBar; }; PublicFoo* attack(Foo* supposedly_secure) { return reinterpret_cast<PublicFoo*>(supposedly_secure); }
int attack_bar(Foo const* supposedly_secure) { const auto start_of_the_object = reinterpret_cast<char*>(supposedly_secure); const auto offset = sizeof(int); // skip over m_Foo field const auto location = start_of_the_object + offset; return *reinterpret_cast<int*>(location); }
Hiç yorum yok:
Yorum Gönder