Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确地将指向blob的void指针强制转换为结构指针?_C++_C_Pointers_Struct - Fatal编程技术网

C++ 如何正确地将指向blob的void指针强制转换为结构指针?

C++ 如何正确地将指向blob的void指针强制转换为结构指针?,c++,c,pointers,struct,C++,C,Pointers,Struct,short: 我收到的: void* -> blob |version(int)|timestamp(long)|number(unsigned)|data(char[x])| 我想要的是: 将其转换为Data* 明确: 我通过网络收到一个BLOB,并希望将其转换为以下结构(或类似结构): 其中Data.Data是长度可变的无符号字符数组(JPEG图像)。 这个数组是由turbo JPEG库生成的,我设置了指针Data.Data=generated\u image(类型为unsigned

short:

我收到的:

void* -> blob |version(int)|timestamp(long)|number(unsigned)|data(char[x])|
我想要的是:

将其转换为
Data*

明确:

我通过网络收到一个BLOB,并希望将其转换为以下结构(或类似结构):

其中Data.Data是长度可变的无符号字符数组(JPEG图像)。 这个数组是由turbo JPEG库生成的,我设置了指针
Data.Data=generated\u image
(类型为unsigned char[])

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

我不能使用固定长度,就像我不知道数据的长度一样

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

一个简单的解决方法是:

struct Data
{
    struct Header
    {
        int version;
        long timestamp;
        unsigned number;
    }
    unsigned char data[FIXED_SIZE];
};
数据
发送到另一个进程只会从当前进程的内存空间发送一个地址,对另一个进程没有用处(不包括共享内存)。您应该在发送之前将其序列化为字节序列

一个简单的解决方法是:

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

我猜您是使用以下方式发送的:

Data d;
// fill in d
send(SOME_SOCKET, static_cast<char*>(&d), sizeof(d), ...);
这样,您还可以获得数据的大小,并将其分别序列化到套接字:

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

我猜您是使用以下方式发送的:

Data d;
// fill in d
send(SOME_SOCKET, static_cast<char*>(&d), sizeof(d), ...);
这样,您还可以获得数据的大小,并将其分别序列化到套接字:

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

您是否正在发送
struct
?如果是这样,您将发送指针,它在接收端将不会指向任何地方。@BoBTFish“数据肯定是通过网络发送的,因为我正在观察网络”示例中有语法错误,内部
struct Header
已声明但从未实际使用过,它应该是例如
struct Header{…}Header
创建该类型的
struct Data
成员。@Theolodis非常感谢您让我们投入宝贵的时间,不仅为您的问题找到解决方案,而且必须首先找到问题。如果你不能很好地描述你的问题,你怎么能期望我们找到一个合适的解决方案?@Theolodis也许你没有意识到,如果不包括你真正的代码,你的问题就相当于:“这里有一些代码:
int main(){std::难道你只是在发送
struct
?如果是这样,你将发送指针,而指针在接收端将不会指向任何地方。@BoBTFish“数据肯定是通过网络发送的,因为我正在观察网络“示例中存在语法错误,声明了内部
struct Header
,但从未实际使用过,例如
struct Header{…}”header;
创建该类型的
struct Data
的成员。@Theolodis非常感谢您让我们投入宝贵的时间,不仅为您的问题找到解决方案,而且还必须先找到问题。如果您无法正确描述您的问题,您如何期望我们找到正确的解决方案?@Theolod也许你没有意识到,如果不包括你的真实代码,你的问题就等同于:“这里有一些代码:
int main(){std::cout谢谢你的时间,但我不能使用固定长度,因为图像的长度是可变的,未定义的。谢谢你的时间,但我不能使用固定长度,因为图像的长度是可变的,未定义的。