2013-10-18 51 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

相关问题