【问题标题】:How to correctly cast void pointer to blob to a struct-pointer?如何正确地将指向 blob 的 void 指针转换为结构指针?
【发布时间】:2013-10-18 12:52:56
【问题描述】:

简短:

我收到了什么:

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(of type unsigned char[])

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

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

【问题讨论】:

  • 您只是发送struct 吗?如果是这样,您将发送指针,而在接收方将不会指向任何地方。
  • @BoBTFish "数据肯定是通过网络发送的,因为我正在观察网络"
  • 示例中存在语法错误,内部struct Header已声明但从未实际使用过,应该是例如struct Header {...} header; 创建该类型的 struct Data 的成员。
  • @Theolodis 非常感谢您让我们投入宝贵的时间,不仅要找到解决问题的方法,还要先找到问题。如果您懒得正确描述您的问题,您怎么能指望我们找到合适的解决方案?
  • @Theolodis 也许您没有意识到,如果不包含您的真实代码,您的问题就相当于:“这里有一些代码:int main(){ std::cout << "Hello world\n"; }。为什么我的 Doom 克隆会崩溃?”

标签: c++ c pointers struct


【解决方案1】:
 unsigned char* data;

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

一个简单的解决方法是:

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

【讨论】:

  • 感谢您的时间,但我不能使用固定长度,因为图像是可变的、未定义的长度。
【解决方案2】:

我猜你正在使用类似的方式发送它:

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(), ...);

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2023-03-26
    • 2014-10-01
    • 1970-01-01
    • 2020-10-21
    • 2015-01-24
    相关资源
    最近更新 更多