1

短的:

我收到什么:

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[])

问题出在接收端,我尝试将指向 的 void 指针blob转换为指向struct Data. Header 没问题,但Data->data似乎是 null/超出范围,而不是 char 数组。

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

4

2 回答 2

4
 unsigned char* data;

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

一个简单的解决方法是:

struct Data
{
    struct Header
    {
        int version;
        long timestamp;
        unsigned number;
    }
    unsigned char data[FIXED_SIZE];
};
于 2013-10-18T13:01:19.430 回答
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(), ...);
于 2013-10-18T13:03:43.193 回答