首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XDR序列化字符串的变量长数组

XDR序列化字符串的变量长数组
EN

Stack Overflow用户
提问于 2016-05-12 09:02:54
回答 1查看 689关注 0票数 2

我正在XDR上序列化一个数据包,但我不明白如何提供字符串向量。这里为std::vector of uint64_t提供了一个小的、完全工作的序列化/反序列化。这里我的代码:

串行化器

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>
#define MAX_LENGTH_ 100

int main(void)
{
    XDR xdr;
    xdrstdio_create(&xdr, stdout, XDR_ENCODE);

    std::vector<uint64_t> ids; // vector i want to send
    ids.push_back(1);
    ids.push_back(2);
    ids.push_back(3);

    // serializing the vector
    uint64_t *_ids = &ids[0];
    uint32_t size = ids.size();
    xdr_array(&xdr,(char**)(&_ids), &size, MAX_LENGTH_,sizeof(uint64_t),(xdrproc_t)xdr_u_long);

    return 1;
}

反序列化器

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>
#define MAX_LENGTH_ 100

int main(void)
{
    XDR xdrs;
    xdrstdio_create(&xdrs, stdin, XDR_DECODE);

    uint64_t *ids_ = new uint64_t[MAX_LENGTH_];
    uint32_t size;
    bool status = xdr_array(&xdrs,(char**)(&ids_), &size, MAX_LENGTH_,
                        sizeof(uint64_t), (xdrproc_t)xdr_u_long);

    std::vector<uint64_t> ids(ids_,ids_+size);
    for(std::vector<uint64_t>::iterator it = ids.begin(); it != ids.end(); ++it) 
    {
        std::cout << *it <<std::endl;
    }

    return 1;
}

下面的代码有效..。运行./serializer | ./deserializer,我得到了12,3,现在我不知道如何处理std::vector<std::string>序列化的问题。使用xdr_string可以很好地使用单个字符串。

array

任何帮助都是非常感谢的!

编辑:

我尝试了以下方法:序列化程序

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>
#include <algorithm>
#include <cstring>


#define MAX_VECTOR_LENGTH_ 100
#define MAX_STRING_LENGTH_ 50

char *convert(const std::string & s)
{
   char *pc = new char[s.size()+1];
   std::strcpy(pc, s.c_str());
   return pc; 
}

int main(void)
{
    XDR xdr;
    xdrstdio_create(&xdr, stdout, XDR_ENCODE);

    std::vector<std::string> messages; // vector i want to send
    messages.push_back("this is");
    messages.push_back("my string");
    messages.push_back("vector test");

    // transform the vector to c style
    std::vector<char*> messagesCStyle;
    std::transform(messages.begin(), messages.end(), std::back_inserter(messagesCStyle), convert);  

    // serializing the vector
    char **_messages = &messagesCStyle[0];
    uint32_t size = messages.size();
    xdr_array(&xdr,(char**)(&_messages), &size, MAX_VECTOR_LENGTH_ * MAX_STRING_LENGTH_,sizeof(char),(xdrproc_t)xdr_string);

    return 1;
}

Deserializer

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>

#define MAX_VECTOR_LENGTH_ 100
#define MAX_STRING_LENGTH_ 50

int main(void)
{
    XDR xdrs;
    xdrstdio_create(&xdrs, stdin, XDR_DECODE);

    std::vector<char*> messagesCStyle_;
    uint32_t size;
    bool status = xdr_array(&xdrs,(char**)(&messagesCStyle_), &size, MAX_VECTOR_LENGTH_,
                        MAX_STRING_LENGTH_, (xdrproc_t)xdr_string);

    for(std::vector<char*>::iterator it = messagesCStyle_.begin(); it != messagesCStyle_.end(); ++it) 
    {
        std::cout << *it <<std::endl;
    }

    return 1;
}

我很确定序列化程序的代码不是最好的,但至少它会接缝工作。但是反序列化器不!!我认为问题与以下事实有关:在调用xdr_array之前,我不知道要分配多少内存。有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-13 12:44:17

我让它成功了:

编码器

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>
#include <algorithm>
#include <cstring>


#define MAX_VECTOR_LENGTH_ 100
#define MAX_STRING_LENGTH_ 50

char *convert(const std::string & s)
{
   char *pc = new char[s.size()+1];
   std::strcpy(pc, s.c_str());
   return pc; 
}

int main(void)
{
    XDR xdr;
    xdrstdio_create(&xdr, stdout, XDR_ENCODE);

    std::vector<std::string> messages; // vector i want to send
    messages.push_back("this is");
    messages.push_back("my string");
    messages.push_back("vector test");
    messages.push_back("this is a relatively long string!!!");

    // transform the vector to c style
    std::vector<char*> messagesCStyle;
    std::transform(messages.begin(), messages.end(), 
        std::back_inserter(messagesCStyle), 
        [](const std::string & s){ 
           char *pc = new char[s.size()+1];
           std::strcpy(pc, s.c_str());
           return pc; 
        });  

    // serializing the vector
    char **_messages = &messagesCStyle[0];
    uint32_t size = messages.size();
    xdr_array(&xdr,(char**)(&_messages), &size, MAX_VECTOR_LENGTH_ * MAX_STRING_LENGTH_,sizeof(char*),(xdrproc_t)xdr_string);

    return 1;
}

解码器

代码语言:javascript
复制
#include <stdio.h>
#include <iostream>
#include <rpc/rpc.h>
#include <vector>

#define MAX_VECTOR_LENGTH_ 100
#define MAX_STRING_LENGTH_ 50

int main(void)
{
    XDR xdrs;
    uint32_t size;
    char** buffer = NULL;

    xdrstdio_create(&xdrs, stdin, XDR_DECODE);

    bool status = xdr_array(&xdrs, (char**) &buffer, &size, MAX_VECTOR_LENGTH_,
                        sizeof(char*), (xdrproc_t)xdr_string);

    std::cout << "status: " << status << std::endl;                    
    std::cout << "size: " << size << std::endl;

    std::vector<std::string> stringMessages_(buffer, buffer + size);

    for(std::vector<std::string>::iterator it = stringMessages_.begin(); it != stringMessages_.end(); ++it) 
    {
        std::cout << *it <<std::endl;
    }

    for (int i = 0; i < size; i++) {
        free(buffer[i]);
    }
    free(buffer);

    return 1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37182109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档