2009-08-03 7 views
1

Ich möchte einige Informationen sowie einige Metadaten in einem Byte-Array packen. Im folgenden habe ich 3 Bytes an Informationen, die am Anfang des Pakets am Ende einen bestimmten Offset plus 4 Bytes Metadaten hinzugefügt haben. Lösung 1 Ich kam auf, ist offensichtlich, zu tun, aber erfordert eine zweite tmp Variable, die ich nicht wirklich mag.Elegante Möglichkeit zum Hinzufügen von Metainformationen zu Char-Array

int size = 3; 
int metadata = 4; 

unsigned char * test = new unsigned char[size]; 
unsigned char * testComplete = new unsigned char[size+metadata]; 

test[offest1] = 'a'; 
test[offest2] = 'b'; 
test[offest3] = 'c'; 

set_first_4bytes(testComplete, val);   
memcpy(&testComplete[metadata], test, size); 

Eine weitere einfache Lösung wäre es die folgende Art und Weise zu tun:

unsigned char * testComplete = new unsigned char[size+metadata]; 

testComplete[offest1+metadata] = 'a'; 
testComplete[offest2+metadata] = 'b'; 
testComplete[offest3+metadata] = 'c'; 

set_first_4bytes(testComplete, val); 

Allerdings Ich mag don nicht hier, um die Tatsache, dass jedes Mal, dass ich die Metadaten-Offset hinzuzufügen, so dass ich die bekommen rechter Index in meinem letzten Paket. Gibt es eine andere elegante Lösung, die nicht die Nachteile meiner Ansätze hat?

Danke!

Antwort

1
unsigned char * testComplete = new unsigned char[size+metadata]; 
unsigned char * actualData = testComplete + metadata; 
+0

Das sieht gut aus, vielen Dank! –

2

Speichern Sie die Daten und Metadaten in separaten char-Arrays innerhalb einer Struktur. Templatisieren Sie die Struktur auf der Länge der Arrays.

0
// Create space for the first four bytes. 
std::vector<char> testComplete(metadata); 
testComplete.reserve(metadata+size);  // to avoid re-allocation 

// Add last three to the back. 
testComplete.push_back('a'); // sets testComplete[metadata+offset1] to 'a' 
testComplete.push_back('b'); 
testComplete.push_back('c'); 

// pass raw pointer to char, or change this function to take std::vector 
set_first_4bytes(&(testComplete[0]), val); 
2

Ich würde Ihnen empfehlen, die C++ - Funktionen zu verwenden. Verwenden Sie eine echte Klasse für die Zusammensetzung der Daten. Innerhalb der Klasse bevorzugen Sie std :: vector <> über einfache Arrays, um die Daten zu speichern (außer Sie müssen die Daten im Heap speichern). Wenn Sie es benötigen, können Sie konstante Zugriffe auf die internen Daten im Vektor bereitstellen.

class data_type 
{ 
public: 
    data_type() : data_(), metadata_() {} 

    const unsigned char * raw_data() const { // accessor to vector internal buffer 
     return &data_[0]; 
    } 
    const std::vector< unsigned char >& data() const { 
     return data_; 
    } 
    const metadata_type& metadata() const { 
     return metadata_; 
    } 
private: 
    std::vector< unsigned char > data_; 
    metadata_type metadata_; // it can be of any type 
}; 
Verwandte Themen