2013-10-22 76 views
2

我有一個C實現,我將一個變量列表的參數序列化到一個字節數組中。因此,我可以將一定數量的變量保存到文件中。將變量列表的參數序列化爲C++中的字節數組的最佳方法?

C語言中的代碼如下所示:

static uint8_t byte_array[1024]; 

/* In this example, we assume that fmt contains only 'c', 'i', or 'f' 
    We also assume that an argument is available for each char in fmt. 
*/ 

uint8_t * serialize_args(const char *fmt, ...) { 
    char *ptr = fmt; 
    uint32_t idx = 0; 
    va_list args; 
    va_start(args, fmt); 

    while(*ptr != NULL) { 
    char p = *ptr++; 
    char c; 
    int i; 
    float f; 

    switch(p) { 
     case 'c': /* serialize char */ 
     c = va_arg(args, int32_t); 
     byte_array[idx++] = (uint8_t) c; 
     break; 
     case 'i': /* serialize int */ 
     i = va_arg(args, int32_t); 
     memcpy(&byte_array[idx], &i, sizeof i); 
     idx += sizeof i; 
     break; 
     case 'f': /* serialize float */ 
     f = (float)va_arg(args, double); 
     memcpy(&byte_array[idx], &f, sizeof f); 
     idx += sizeof f; 
     break; 
    } 
    }  
    va_end(args, fmt); 

    byte_array[idx++] = 0; 
    return byte_array; 
} 

現在,讓我們說,我想在C翻譯這個++。什麼容器最適合? 一個向量?我會看起來像這樣:

vector<uint8_t> serialize_args(const char *fmt, ...) { 
    char *ptr = fmt; 

    vector<uint8_t> byte_array; 

    va_list args; 
    va_start(args, fmt); 

    while(*ptr != NULL) { 
    char p = *ptr++; 
    char c; 
    int i; 
    float f; 

    switch(p) { 
     case 'c': // serialize char 
     c = (char)va_arg(args, int32_t); 
     byte_array.push_back(c); // do I need a cast ? 
     break; 
     case 'i': // serialize int 
     i = va_arg(args, int32_t); 
     // here how do I memcpy to a vector ? 
     break; 
     case 'f': // serialize float 
     f = (float)va_arg(args, double); 
     // here how do I memcpy to a vector ? 
     break; 
    } 
    }  

    va_end(args, fmt); 

    return byte_array; 
} 

任何建議?

回答

1

是合法的引用任何類型的指針爲字符類型,所以你可以做以下的(和舉例int):

for (unsigned char* p = &i; p != &i+sizeof(int); ++p) 
    byte_array.push_back(*p); 

或者更idiomaticaly:

std::copy(&i, &i + sizeof(int), std::back_inserter(byte_array)); 

您也可以使用memcpy,但您需要預先爲sizeof(int)字節騰出空間,使用向量的resize方法。

而在C++ 11中,您將完全擺脫可變參數並使用可變參數模板函數。

相關問題