2012-02-08 16 views
6

Seri iletişim kanalı üzerinden iletilen ve alınan bir dizi iletiyi tanımlayan bir belgeyi teslim ettim. Gelen mesajları almak ve bunları nesnelere dönüştürmek ve giden mesajlarımı serileştirmek istiyorum. tel üzerinden kodlayan kurulmuş ve değiştirilemez ve örneğin başlığında çeşitli bit alanlara ve farklı yükler oluşur, Bir bit alanının seri hale getirilmesi ve serileştirilmesi

class Message{ 
int msg_num : 7 
int dest_addr : 4 
bool SRR : 1 
bool IDE : 1 
int source_addr : 6 
//... and so on... 
} 

I protobufs kullanarak bir göz aldı ancak kodlama bunların VarInt yöntemi olduğu görünür kurdu. Ayrıca, boost-serialization'a da baktım, ama şu ana kadar okuduğum şeye göre, kodlamanın nasıl yapıldığı tamamen açık değil. Yani

, birkaç soru:

  • Ben nesnelere benim byte akışını dönüştürmek için boost-seri kullanabilir miyim? (Bir bakım karışıklık) serileştirme için kendi rutinleri rulo zorunda değil hedefi ile
  • , örneğin özel bir boost-serileştirme Arşivi, başka bir yöntem keşfettim ettik (benim görevi yerine getirmeye için tercih edilen bir mekanizma yoktur
+0

"int msg_num: 7" Does not primitive, ben seri hale docs derinliklerinde kayboldum var alan 7 bitlik tamsayı olduğu anlamına ? – grieve

+0

Evet. ": Num" bit alanının uzunluğunu gösterir – jdt141

+0

Bu sorunun cevabını bulmak zor, sadece paketlenmiş gösterimi gösterdiği gibi, serileştirmek ve serileştirmek istediğiniz paketlenmemiş mesaj nesneleri. –

cevap

1

Baktığınız özel protokolle eşleşecek kullanımı kolay bir seri hale getirici bulamayacağınızı düşünüyorum. Ama sahip olduğunuz ilkel setin (int, bool + boyut) kendi kod çözücünüzü/kodlayıcınızı yazabilecek kadar basit görünmesine neden olur. Sadece alınan mesaja göre C/C++ kodu üretme. Böyle bir açıklama alarak bir derlenebilir kod oluşturmak oldukça basit bir görev olmalıdır. Protobuf/Corba'nın yaptığı gibi, derleme zamanında yapılan otomatik bir nesil olmalı.

Örnek: dönüştürücü (Özet gösterim ve varsayarak MSB) 'e benzer bir vücut ile fonksiyon yazabiliriz

class Message{ 
    int msg_num : 7 
    int dest_addr : 4 
    bool SRR : 1 
    bool IDE : 1 
    int source_addr : 6 
    //... and so on... 
} 

: tarifnameden

Çözücü:

m = new Message() 
{ 
    long long val = 0 
    for(int i=0; i<7; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.msg_num = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<4; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.dest_addr = val 
} 
{ 
    int val = nextByte() 
    m.SRR = val 
} 
{ 
    int val = nextByte() 
    m.IDE = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<6; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.source_addr = val 
} 
// and so on 

Kodlayıcı:

{ 
    long long val = m.msg_num 
    for(int i=0;i<7;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
{ 
    long long val = m.dest_addr 
    for(int i=0;i<4;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
.... 

Bu, oluşturmanın oldukça kolay olması ve kodlamanın özel olduğundan emin olmanın en kolay yolu olmalıdır.

+0

AFAIK standardı, uygulamayı, bit alanları için int'den farklı bir biçimde kullanmaya zorlamamaktadır (kodunuzda farklı bir türde yazsanız bile, örneğin char veya bool) ve standart, bit alanlarının uygulanıp uygulanmadığına uygulamadan ayrılır. MSB bellekte MSB'ye veya başka bir şekilde sipariş edildi. Bu baypas byte byte nedeniyle bit alanları ile sorunlu olabilir. – selalerer

+1

Elbette. Cevabım, çözümden daha iyi bir örnekti - baytların tel üzerinden tam olarak nasıl gönderileceğine bağlı olarak, tam uygulama protokolü yansıtmalıdır. Nasıl yapılabileceğine dair fikri göstermek daha fazla oldu: dönüştürme kodunu oluşturmak işi yapmalıdır. –

0

Yalnızca tek bir platformla sınırlı olmanız durumunda (yani, tek bayt sırası ile sınırlı) ve İleti POD türündeyse, iletinizi primitive olarak bildirebilirsiniz.

Aksi taktirde, en azından güçlendirme durumunda, kod yazmak, yani 'serileştirme için rutinleri' yazmanız gerekir. Bu bayt sırası dönüşümleri, en az

destekler

[Düzenle] Yanlış, bu

İlgili konular