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 は可変長の unsigned char の配列 (JPEG 画像) です。Data.data = generated_imageこの配列はターボ JPEG ライブラリによって生成され、 (unsigned char[] 型の)ポインターを設定します。

問題はレシーバー側にあり、void ポインターを へのポインターにキャストしようとしblobますstruct Data。ヘッダーには問題ありませんData->dataが、char 配列ではなく、null/範囲外のようです。

!の長さがわからないので、一定の長さを使用できません。data

4

2 に答える 2

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 に答える