ko'rsatkichlar bilan struktura nusxasini nusxalash va qayta to'ldirish

Men Windowsda emulyatsiya vositasi ustida ishlayapman.

Ilovani tutib, men bir vaziyatga tushib qoldim.

Menda quyidagi formatga ega c++ tuzilishi bor

typedef struct node {
  int open;
  int version;
  const unsigned long long * data;
  char* flags;
} _node;

Bu ikkilik faylga ishlov beruvchi. Men API tutilishini qilyapman va bu ko'rsatgichni ilova tomonidan amalga oshirilayotgan ichki API chaqiruvidan olaman.

Shuningdek, yuqoridagi tuzilmadagi ma'lumotlar maydoni bir-biriga yaqin joylashgan ikkita tuzilmaning misollariga ko'rsatgichdir. Ikki tuzilma quyidagicha.

typedef struct header{
  unsigned int open;
  unsigned int version;
  unsigned long long int length;
} _header;


typedef struct body{
  unsigned int v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;
  unsigned long long int ll1, ll2;
} _body;

Men ma'lumotlar maydoniga quyidagi tarzda kirishim va chop etishim mumkin.

_node* First=(node *)address;//Address is a pointer that i get from intercepting an application
_header* nodeHeader=(_header*)First->data;
char *bodyPtr=(char *)(nodeHeader+1);
_body* nodeBody=(_body *)(bodyPtr);
unsigned long long int offset=0;

while(!(nodeBody->v1 & 1) && offset< nodeHeader->length)
{
 nodeBody=(_body*)(bodyPtr+offset);
 offset=nodeBody->v2+nodeBody->v3;
}

Men struktura tugunining namunasini matn fayliga yozmoqchiman va keyinroq uni struktura misolida qayta o'qiy olaman. Buni qilishning eng yaxshi usuli qanday? Men c++ da javob olmoqchiman

Men c++ kodini xohlayman, chunki men ishlayotgan kod c++ da. Men bu yerga joylagan kodda typedef bor, chunki tuzilmani yozgan odamlar uni C da yozgan.

Agar bu yordam bersa, menga ushbu ma'lumotni o'z asbobim bilan ilovaga taqlid qilishim uchun tuzilishda kerak bo'ladi. Tuzilishning ba'zi jihatlari ichki bo'lgani uchun va mendan yashirin bo'lganligi sababli, tuzilma a'zolarini saqlash va uni qayta qurish eng yaxshi variantdir. keyingi vaqt (emulyatsiya vaqti)


person ash    schedule 10.10.2011    source manba
comment
Qanday qilib data ni anonim struct ni ko'rsatishi mumkin?   -  person Mark B    schedule 10.10.2011
comment
C++ yoki C da javob olishni xohladingizmi? Siz haqiqatan ham birini tanlashingiz kerak - ikkalasiga ham javoblar juda farq qiladi.   -  person Flexo    schedule 10.10.2011
comment
@mark Men buni bilmayman! Bu men dasturni ushlab qolish orqali olgan tuzilma. Men undan foydalanish imkoniyatiga ega bo'lishni xohlayman. Butun struktura asosan ikkilik formatga ishlov beruvchidir   -  person ash    schedule 10.10.2011
comment
Siz C++ da javob olishni xohlaysiz, lekin ikkita ko'rsatkichni ushlab turish uchun butun sonni suiiste'mol qilasizmi? Bu qanday Wile E Coyote mantiqidir?   -  person Kerrek SB    schedule 10.10.2011
comment
@awoodland Men c++ tuzilmasi borligini aytdim. shuning uchun odamlar menga c ++ javobini beradi deb o'yladim! Yaxshiyamki, men unga c++ yechimini xohlayotganimni qo'shib qo'ydim. Rahmat!   -  person ash    schedule 10.10.2011
comment
@KerrekSB Bunga javob berishni qanchalik istardim! Faqat bu men ilovadan tutib olgan sirli ikkilik faylning bir qismi.   -  person ash    schedule 10.10.2011
comment
Siz ma'lumotlarni to'xtatdingiz, lekin ehtimol siz ushbu kodni yozdingiz. To'g'rimi? Chunki har kim o'ylaymanki, savolga javob berishidan oldin kod ishlashi kerak.   -  person Grumdrig    schedule 10.10.2011
comment
Bu kod hatto kompilyatsiya qilinmaydi. Bu haqiqiy savol emas. Men yopish uchun ovoz beraman.   -  person sbi    schedule 10.10.2011
comment
Yigitlar turinglar. Men yozgan kodda noto'g'ri taassurot qoldirdim deb o'ylayman. Keling, batafsilroq aytib beraman.   -  person ash    schedule 10.10.2011
comment
@Grumdrig Men tana tuzilishidagi 12 ta o'zgaruvchining har birining nomini aytib berishga dangasa bo'ldim va bu bizga bu chalkashlikni keltirib chiqardi. Bu haqida uzr   -  person ash    schedule 10.10.2011
comment
@ash: U hali ham kompilyatsiya qilmaydi. (struct {} blah; bu siz o'ylagandek emas.)   -  person sbi    schedule 10.10.2011
comment
@sbi Kechirasiz, lekin men sizning fikringizni tushunmayapman. Menda uchta tuzilma bor. Struktura tuguni, struktura sarlavhasi va struktura tanasi. Bu yerda nima haqida gapiryapsiz?   -  person ash    schedule 10.10.2011
comment
Bu, hech bo'lmaganda, men uchun tashvish emas edi. Men sizning psevdokodingizni hech bo'lmaganda hozir tushunganimdek tushundim. Agar siz ushbu ma'lumotlarni saqlamoqchi bo'lsangiz va yuklamoqchi bo'lsangiz, sizga haqiqiy kod kerak emasmi? Nega u yerdan boshlamaysiz?   -  person Grumdrig    schedule 10.10.2011
comment
@ash: Men sizda node, header va body uchta tuzilishga ega emasligingiz haqida gapiryapman. struct {} blah; blah tuzilmasini aniqlamaydi. (Va siz C++ da struct blah yozishingiz shart emas, bu C-ism. Shunchaki blah qiladi. Siz yaxshi C++ kitobi.)   -  person sbi    schedule 10.10.2011
comment
@ash: Agar siz haqiqatan ham dangasa bo'lsangiz va kodni tuzgan bo'lsangiz, uni savolga nusxalab, joylashtirgan bo'lar edingiz va bizda davom etishimiz kerak bo'ladi. Odatda bizga kerak bo'lgan narsa - tez terilgan ko'rinish emas, balki haqiqiy kod. Bundan tashqari, data nimaga ishora qilganini aniqroq bilishingiz kerak. Bu darhol keyingi boshqasiga ega bo'lgan strukturaga ko'rsatgichmi yoki undan murakkabmi?   -  person David Thornley    schedule 10.10.2011
comment
@sbi Sintaksis bilan noqulay bo'lganim uchun uzr so'rayman. Lekin menda ochiq-oydin masalalarni ko'zdan kechirish va mavzuga kirish muammosi bor. O'ylaymanki, men narsalarni aytib beradigan odam emasman. Ammo baribir bu sizni tanbehdan keyin savolga javob berishga to'sqinlik qilmasligi kerak edi! har holda yordam uchun rahmat   -  person ash    schedule 10.10.2011
comment
@DavidThornley umid qilamanki, tahrirlarim mening noto'g'ri soxta kodimni sirli qiladi!   -  person ash    schedule 10.10.2011
comment
Siz C++ da javob olishni xohlaysiz, lekin tuzilmalaringizni yozdingizmi? Bu Daffy Duck qanday mantiq?   -  person Kerrek SB    schedule 10.10.2011
comment
@ash: Xabarni buzmang, keyin uni boshqa joyga qayta joylashtirmang. Mantiqiy bo'lishi uchun uni tahrirlang, keyin odamlar qayta ochish uchun ovoz beradi.   -  person Lightness Races in Orbit    schedule 10.10.2011
comment
Ko'p odamlar bu savolni amalga oshirish uchun kuch sarflaganlari uchun men oldinga o'tdim va ... uni kuchaytirdim. Asosan, men ketma-ketlikni kuchaytirish bilan mashq qilishni talab qilganim uchun :_)   -  person sehe    schedule 11.10.2011


Javoblar (1)


Men savolning barcha kontekstini to'g'ri tushuna olmaganimga ishonchim komil emas, lekin bu erda ketma-ketlikni kuchaytirishga asoslangan sozlash:

Albatta, men C++ usulini tanladim

  • std::pair yoki std::tuple yordamida ketma-ket saqlangan tuzilmalar juftligini modellashtirish (qarang: element_t). 2
  • Men element_t* o'rniga element_t ro'yxatidan foydalanishni afzal ko'raman. Nima bo'lishidan qat'iy nazar, u ushbu kutubxona bilan ikkala usulda ishlaydi
  • Aniqlik uchun men XML ni tanladim: namunada nima ketma-ketlashtirilganligi va takroriy (taxallus) ko'rsatkichlar to'g'riga qanday ishlov berilishi va tiklanishi aniq ko'rsatilgan.
  • #P3#
     ar & NVP(version) & NVP(open) & NVP(length);
    
    #P4#
     ar & version & open & length;
    
    #P5#
  • yozilganidek, namuna ma'lumotlar elementlarini sizdiradi (shunchaki demo va men bir nechta narsalarni sinab ko'rdim; men faqat sizning savolingizga yanada yaqinroq mos kelish uchun ko'rsatgichlardan foydalanishga qaror qildim)

1 oop, sizga fstreamlarni ochishda std::ios:binary ni deyarli unutib qo'ydim!
2E'tibor bering, ma'lum bir xotiradagi tartib uchun to'g'ri moslashtirish/to'ldirishga erishish uchun #pragma yordamida strukturani o'zgartirishingiz kerak bo'lishi mumkin. Bu mening javobim doirasidan tashqarida

Oh, kompilyatsiya qiling

g++ -O2 -g test.cpp -lboost_serialization

Boost v.1_42 orqali boost v.1_47 bilan sinovdan o‘tkazildi


#include <boost/serialization/list.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <fstream>
#include <string>

#define NVP BOOST_SERIALIZATION_NVP // name-value pairs

struct header
{
    unsigned int open;
    unsigned int version;
    unsigned long long int length;

    header() : open(1), version(2), length(3) {} 

private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive & ar, const unsigned int archversion)
    {
        ar & NVP(version) & NVP(open) & NVP(length);
    }
};

struct body
{
    unsigned int iv[20];
    unsigned long long int ll1, ll2;

    body() : ll1(1), ll2(2)
    {
        for (int i=0; i<20; i++)
            iv[i] = i;
    }

private:
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive & ar, const unsigned int archversion)
    {
        ar & NVP(ll1) & NVP(ll2) & NVP(iv);
    }
};

typedef std::pair<header, body> element_t;

struct node
{
    int open;
    int version;
    std::list<element_t*> data;
    std::string flags;

    node() : open(1), version(2), flags("hello") { }

private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int archversion)
    {
        ar & NVP(version) & NVP(open) & NVP(flags) & NVP(data);
    }
};

int main()
{
    node anode;
    anode.data.push_back(new element_t(header(), body()));
    element_t* duplicated = new element_t(header(), body());
    anode.data.push_back(duplicated);
    anode.data.push_back(new element_t(header(), body()));
    anode.data.push_back(duplicated);

    {
        std::ofstream ofs("/tmp/test.xml");
        boost::archive::xml_oarchive archive(ofs);

        archive << NVP(anode);
        ofs.flush();
        ofs.close();
    }
    return 0;

    {
        std::ifstream ifs("/tmp/test.xml");
        boost::archive::xml_iarchive archive(ifs);

        node deserialized;

        archive >> NVP(deserialized);
    }

    return 0;
}

Namunaviy chiqish (test.xml)

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="9">
<anode class_id="0" tracking_level="0" version="0">
    <version>2</version>
    <open>1</open>
    <flags>hello</flags>
    <data class_id="1" tracking_level="0" version="0">
        <count>4</count>
        <item_version>0</item_version>
        <item class_id="2" tracking_level="1" version="0" object_id="_0">
            <first class_id="3" tracking_level="0" version="0">
                <version>2</version>
                <open>1</open>
                <length>3</length>
            </first>
            <second class_id="4" tracking_level="0" version="0">
                <ll1>1</ll1>
                <ll2>2</ll2>
                <iv>
                    <count>20</count>
                    <item>0</item>
                    <item>1</item>
                    <item>2</item>
                    <item>3</item>
                    <item>4</item>
                    <item>5</item>
                    <item>6</item>
                    <item>7</item>
                    <item>8</item>
                    <item>9</item>
                    <item>10</item>
                    <item>11</item>
                    <item>12</item>
                    <item>13</item>
                    <item>14</item>
                    <item>15</item>
                    <item>16</item>
                    <item>17</item>
                    <item>18</item>
                    <item>19</item>
                </iv>
            </second>
        </item>
        <item class_id_reference="2" object_id="_1">
            <first>
                <version>2</version>
                <open>1</open>
                <length>3</length>
            </first>
            <second>
                <ll1>1</ll1>
                <ll2>2</ll2>
                <iv>
                    <count>20</count>
                    <item>0</item>
                    <item>1</item>
                    <item>2</item>
                    <item>3</item>
                    <item>4</item>
                    <item>5</item>
                    <item>6</item>
                    <item>7</item>
                    <item>8</item>
                    <item>9</item>
                    <item>10</item>
                    <item>11</item>
                    <item>12</item>
                    <item>13</item>
                    <item>14</item>
                    <item>15</item>
                    <item>16</item>
                    <item>17</item>
                    <item>18</item>
                    <item>19</item>
                </iv>
            </second>
        </item>
        <item class_id_reference="2" object_id="_2">
            <first>
                <version>2</version>
                <open>1</open>
                <length>3</length>
            </first>
            <second>
                <ll1>1</ll1>
                <ll2>2</ll2>
                <iv>
                    <count>20</count>
                    <item>0</item>
                    <item>1</item>
                    <item>2</item>
                    <item>3</item>
                    <item>4</item>
                    <item>5</item>
                    <item>6</item>
                    <item>7</item>
                    <item>8</item>
                    <item>9</item>
                    <item>10</item>
                    <item>11</item>
                    <item>12</item>
                    <item>13</item>
                    <item>14</item>
                    <item>15</item>
                    <item>16</item>
                    <item>17</item>
                    <item>18</item>
                    <item>19</item>
                </iv>
            </second>
        </item>
        <item class_id_reference="2" object_id_reference="_1"></item>
    </data>
</anode>
person sehe    schedule 10.10.2011
comment
OP tuzilmalarini o'zgartirib bo'lmaydi, chunki ular men tushunganimdek, tashqi (ushlangan) APIdan keladi. - person Xeo; 11.10.2011
comment
Men harakatni qadrlayman, lekin Xeo ta'kidlaganidek, tuzilmani o'zgartirib bo'lmaydi. Men buni dasturni ish vaqtida ushlab turish orqali oldim. - person ash; 11.10.2011
comment
@Xeo esda tutingki, siz hech qanday tuzilmalarni o'zgartirishingiz shart emas. Mening namunam ularga asoslangan bo'lib, asosan kompilyatsiya qilish uchun ularni o'zgartiradi. Men OPga moslashishni/integratsiyani qoldiraman. - person sehe; 11.10.2011
comment
Aniq narsani ta'kidlash uchun: shu tarzda har qanday g'alati (POD) tuzilishga ketma-ketlikni qo'shishingiz mumkin. (ixtiyoriy ravishda sarlavhalarni toza saqlash uchun ulardan oling) - person sehe; 11.10.2011