简短:
我收到的内容:
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
的长度!
答案 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(), ...);