⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formatporuke.cpp

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         (*s_iter).DajPozicijuKomponente( IDkomponente, nPozicija, nDuzina ) )
        izlaz = true;

    return izlaz;
}

// Pomocna procedura ( poziva se u 'DeformatPoruku' ). Vraca duzinu komponente u ulaznom stringu,
// a u 'cDeformatiranaKomponenta' vraca taj deo ulaznog stringa u 'deformatiranom' obliku.
unsigned int KSpisakFormata::DeformatKomponentu( string& cDeformatiranaKomponenta, KString cUlazniString, unsigned int nPozUlStr,
                                                 UIFormat formatKomponente, unsigned int nDuzinaKomponente ){
    KString cUlazniStr( cUlazniString );
    unsigned int nDuzinaUlStr = cUlazniString.size();
    unsigned int nDuzinaFormatKomp = 0;
    unsigned int i, j;
    string cBCDcifra = "";


    cDeformatiranaKomponenta.erase();
    // Odradi konverziju stringa u niz bajtova, na osnovu datog formata
    switch ( formatKomponente ) {
    case FS_BCD_ASCII:
        // Konvertuj svaku grupu ASCII znakova koja predstavlja jednu BCD cifru u jedan bajt
        // ( svaki podstring "00" - "FF" konvertuje u 1 bajt; podstring izdvaja u 'znak' )
        for ( i=nPozUlStr, j=0; i<nDuzinaUlStr && j<nDuzinaKomponente; j++ ){
            cBCDcifra.erase();
            // Prihvata i 'jednocifrene' znakove ( ali iza njih mora razmak )
            while ( cUlazniStr[i] != ' ' && cBCDcifra.size() < 2 ) {
                cBCDcifra += cUlazniStr.cString[i];
                i++;
            }
            // Preskoci razmake izmedju dve grupe BCD cifara
            i = cUlazniStr.PreskociRazmake( i );
            cDeformatiranaKomponenta += KKorisno::Instance()->BCDuBajt( cBCDcifra );
        }
        nDuzinaFormatKomp = i - nPozUlStr;
        break;
    case FS_BAJT:
        // deformatirani string se dobija kao kopija odgovarajuceg dela ulaznog stringa
        nDuzinaFormatKomp = nDuzinaKomponente;
        cDeformatiranaKomponenta += cUlazniString.cString.substr( nPozUlStr, nDuzinaFormatKomp );
        break;
    }

    return nDuzinaFormatKomp;
}

// Od formatiranog stringa pravi 'obican niz bajtova'
string KSpisakFormata::DeformatPoruku( KString cUlazniString, KFormatPoruke& format ){
//    KString cUlazniStr( cUlazniString );
    string cIzlazniString;
    string cDeformatiranaKomponenta;
    unsigned int duzinaKomponente;
    unsigned int pozUlStr = 0; // pozicija u ulaznom ('formatiranom') stringu

    TOpisPoruke opisFormata;
    format.DajOpis( opisFormata );
    if ( FormatDefault( format ) ) {
        // kod 'default' formata postoji samo jedna komponenta(SADRZAJ)
        // i ne uzimaju se u obzir polja 'pozicija' i 'duzina' u opisu, vec se uzima ceo string i formatira po opisu te komponente
        TOpisPoruke::iterator o_iter = opisFormata.begin();
        TOpisPoruke::iterator o_iterEnd = opisFormata.end();
        if ( o_iter!=o_iterEnd ){       // trebalo bi da postoji jedna komponenta !!
            duzinaKomponente = cUlazniString.size();
            pozUlStr += DeformatKomponentu( cDeformatiranaKomponenta, cUlazniString, pozUlStr,
                                            FS_BCD_ASCII, duzinaKomponente );
            cIzlazniString += cDeformatiranaKomponenta;
        }
    }
    else {
        TOpisPoruke::iterator o_iter = opisFormata.begin();
        TOpisPoruke::iterator o_iterEnd = opisFormata.end();
        while( o_iter!=o_iterEnd ){     // obidji sve komponente formata
            duzinaKomponente = o_iter->duzina;
            pozUlStr += DeformatKomponentu( cDeformatiranaKomponenta, cUlazniString, pozUlStr,
                                            FS_BCD_ASCII, duzinaKomponente );
            // Preskoci razmake izmedju dve komponente
            pozUlStr = cUlazniString.PreskociRazmake( pozUlStr );
            cIzlazniString += cDeformatiranaKomponenta;
            o_iter++;
        }
    }

    return cIzlazniString;
}

string KSpisakFormata::DeformatPoruku( KString cUlazniString, IDFormataPoruke formatID ){
    // Vraca format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
    KFormatPoruke format;
    // Ako dati format ne postoji koristi DEFAULT format.
    if ( !DajFormatPoruke( formatID, format ) ) DajDefaultFormat( format );
    return DeformatPoruku( cUlazniString, format );
}

// Od 'obicnog niza bajtova' pravi 'formatirani string'.
string KSpisakFormata::FormatPoruku( string cUlazniString, KFormatPoruke& format ){
    string cIzlazniString;

    TOpisPoruke opisFormata;
    format.DajOpis( opisFormata );
    if ( FormatDefault( format ) ) {
        // kod 'default' formata postoji samo jedna komponenta(SADRZAJ) i ne uzimaju se u obzir
        // polja 'pozicija' i 'duzina' u opisu, vec se uzima ceo string i formatira po opisu te komponente
        TOpisPoruke::iterator o_iter = opisFormata.begin();
        TOpisPoruke::iterator o_iterEnd = opisFormata.end();
        if ( o_iter!=o_iterEnd )        // trebalo bi da postoji jedna komponenta !!
            cIzlazniString += KKorisno::Instance()->FormatString( cUlazniString, FS_BCD_ASCII );
    }
    else {
        // Prodji kroz sve komponente poruke i konvertuj u odgovarajuci format za prikaz
        TOpisPoruke::iterator o_iter = opisFormata.begin();
        TOpisPoruke::iterator o_iterEnd  = opisFormata.end();
        string cFormatiranaKomponenta;
        while( o_iter != o_iterEnd  ){
            unsigned int nDuzinaUlaznogStringa = cUlazniString.size();
            // Funkcija 'substr' baca 'out_of_range' exception ako je pozicija substringa 
            // veca od duzine stringa, pa zato imamo sledeci if :
            if ( o_iter->pozicija <= nDuzinaUlaznogStringa ) {
                cFormatiranaKomponenta = KKorisno::Instance()->FormatString( 
                                                cUlazniString.substr( o_iter->pozicija, o_iter->duzina ), 
                                                FS_BCD_ASCII );
                if ( cFormatiranaKomponenta.size() > 0 ){
                    // Ubaci razmak izmadju komponenata
                    if ( cIzlazniString.size() > 0 ) cIzlazniString += " ";
                    cIzlazniString += cFormatiranaKomponenta;
                }
            }
            o_iter++;
        }
    }

    return cIzlazniString;
}

// Od 'obicnog niza bajtova' pravi 'formatirani string'.
string KSpisakFormata::FormatPoruku( string cUlazniString, IDFormataPoruke formatID ){
    KFormatPoruke format;
    // Ako dati format ne postoji koristi DEFAULT format.
    if ( !DajFormatPoruke( formatID, format ) ) DajDefaultFormat( format );
    return FormatPoruku( cUlazniString, format );
}

// Pomocna procedura : ispisuje spisak formata
void KSpisakFormata::OdstampajSpisakTxt( void ){
    cout << "Spisak formata poruka :" << endl;
    TTabelaFormata::iterator s_iter = Tabela.begin();
    TTabelaFormata::iterator s_iterEnd = Tabela.end();
    while( s_iter!=s_iterEnd ){
        cout << "Format : " << s_iter->DajID() << endl;
        TOpisPoruke opis;
        s_iter->DajOpis( opis );
        TOpisPoruke::iterator o_iter = opis.begin();
        TOpisPoruke::iterator o_iterEnd = opis.end();
        while( o_iter!=o_iterEnd ){
            cout << "   " << o_iter->IDkomponente << ", "
                          << o_iter->pozicija << ", "
                          << o_iter->duzina
            << endl;
            o_iter++;
        }
        s_iter++;
    }
}

// Vraca iterator koji ukazuje na element spiska formata sa datim ID-om ili NULL ako ga ne nadje.
TTabelaFormata::iterator KSpisakFormata::DajIterator( IDFormataPoruke formatID ){
    TTabelaFormata::iterator s_iter    = Tabela.begin();
    TTabelaFormata::iterator s_iterEnd = Tabela.end();

    while( s_iter!=s_iterEnd && s_iter->DajID()!=formatID ) s_iter++;
    if ( s_iter==s_iterEnd ) s_iter = NULL;

    return s_iter;
}

// Postavlja velicinu i poziciju date komponente ( ovo zato sto sadrzaj moze da bude promenljiv )
void KSpisakFormata::PostaviPozicijuIDuzinu( IDFormataPoruke formatID, IDKomponentePoruke IDkomponente,
                                             unsigned int nPozicija, unsigned int nDuzina ){
    TTabelaFormata::iterator s_iter = DajIterator( formatID );
    s_iter->PostaviPozicijuKomponente( IDkomponente, nPozicija, nDuzina );
}
//********************************* KSpisakFormata << END >> *************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -