如何正确地将blob的void指针转换为struct-pointer?

时间:2013-10-18 12:52:56

标签: c++ c pointers struct

简短:

我收到的内容:

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图像)。 这个数组是由turbo-JPEG库生成的,我设置了指针Data.data = generated_image(类型为unsigned char [])

问题出在接收方,我尝试将blob的void指针转换为指向struct Data的指针。没有问题的标题,但Data->data似乎是空/超出界限,而不是一个字符数组。

不能使用恒定长度,因为我知道data的长度!

2 个答案:

答案 0 :(得分:4)

 unsigned char* data;

data发送到另一个进程只是从当前进程的内存空间发送一个地址,这对另一个进程(排除共享内存)没有用。您应该在发送之前将其序列化为字节序列。

一个简单的解决方法是:

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

答案 1 :(得分: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;
};

这样你也可以拥有数据大小并将其序列化到套接字中:

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