2013-10-18 75 views
1

短:如何將void指針正確地轉換爲blob到結構指針?

我收到:

void* -> blob |version(int)|timestamp(long)|number(unsigned)|data(char[x])| 

我想要什麼:

丟在類型的指針Data*

明確:

我我正在接受經由網絡BLOB並希望將其澆鑄成以下結構(或類似的一個):

struct Data 
{ 
    struct Header 
    { 
     int version; 
     long timestamp; 
     unsigned number; 
    }__attribute__((packed)) header 
    unsigned char* data; 
} 

其中Data.data是可變長度(JPEG圖像)的無符號字符數組。 該數組由渦輪JPEG文庫中產生的,我設置指針Data.data = generated_image(的類型無符號字符[])

的問題是在接收方,在這裏我嘗試的空隙指針轉換爲所述blob成指向struct Data。標題沒有問題,但Data->data似乎是空/超出界限,而不是一個字符數組。

不能使用固定長度,就像我做知道data的長度!

+7

你剛發送'struct'嗎?如果是這樣,你會發送指針,在接收方指向無處。 – BoBTFish

+0

@BoBTFish「數據通過網絡定義發送,因爲我正在看網絡」 – Theolodis

+2

該示例中存在語法錯誤,內部'struct Header'被聲明但從未實際使用,它應該是例如。 'struct Header {...}頭;'創建該類型的'struct Data'成員。 – unwind

回答

1

我猜你正在使用類似的東西將其發送:

Data d; 
// fill in d 
send(SOME_SOCKET, static_cast<char*>(&d), sizeof(d), ...); 

,將發送您的Data結構,但將包括data指針的值,而不是它指向的內容。

它可能是更好地爲您存儲數據如下,並把它作爲標題和正文:

struct Data 
{ 
    struct Header 
    { 
     int version; 
     long timestamp; 
     unsigned number; 

     std::size_t size; 
    } 
    //unsigned char* data; 
    std::vector<unsigned char> data; 
}; 

所以,你也有數據的大小,並將其序列化到seperately插座:

d.header.size = d.data.size(); 
send(SOME_SOCKET, &d.header, sizeof(d.header), ...); 
send(SOME_SOCKET, &d.data[0], d.data.size(), ...); 
4
unsigned char* data; 

發送data到另一個進程剛剛發送從當前進程的存儲器空間中的地址,它不是對另一處理(排除共享存儲器)是有用的。您應該在發送之前將其序列化爲字節序列。

一個簡單的解決方法是:

struct Data 
{ 
    struct Header 
    { 
     int version; 
     long timestamp; 
     unsigned number; 
    } 
    unsigned char data[FIXED_SIZE]; 
}; 
+0

感謝您的時間,但我不能使用固定長度,因爲圖像是可變的,未定義的長度。 – Theolodis

相關問題