c++ - 动态构造字节数组并返回长度的函数

标签 c++ encode

我需要在类中创建一个编码器函数

bool encodeMsg(unsigned char* buffer, unsigned short& len);

这个类有一些固定长度的成员和一些可变长度的 vector (不同结构)。 我必须根据这些成员变量的某些序列对字节流进行编码。

这是一个可销售的版本,

class test
{
  public:
    test();
    ~test();

    bool encodeMsg(unsigned char* buffer);
    bool decodeMsg(const unsigned char* buffer, unsigned short len);

  private:
    unsigned char a; // 0x12
    unsigned char b; // 0x34
    unsigned char c; // 0x56
}

我想要的是编码时缓冲区中的 0x123456。

问题,

  1. 我应该如何分配内存?因为调用这个函数之前不知道

  2. 有没有一种映射类对象内存的方法,基本上可以满足我的需求。

我知道这是一个非常基本的问题,但想知道最佳和常规的方法。

最佳答案

How should I allocate memory? As It is not known before calling this function

给定你当前的代码,调用者应该分配内存:

unsigned char buffer[3];
unsigned short len = sizeof buffer;
my_test_object.encodeMsg(buffer, len);

Is there a way to map class object memory which basically gives what I want.

这很含糊。如果您使用(可能是特定于编译器的)#pragmaattribute 来确保字符值在内存中占用 3 个连续的字节,并且只要您不添加任何类的虚函数,您可以使用以下方法实现 encodeMsg():

memcpy(buffer, (unsigned char*)this + offsetof(test, a), 3);

但是,有什么意义呢?充其量,我无法想象 memcpy 会比“不错”的编写方式更快:

buffer[0] = a;
buffer[1] = b;
buffer[2] = c;

如果您实际上指的是更类似于:

test* p = reinterpret_cast<test*>(buffer);
*p = *this;

这将有未定义的行为,并且可能将最多 sizeof(test) 字节写入缓冲区,这很可能是 4 而不是 3,这可能会导致一些客户端代码缓冲区溢出, 删除一个已经设置的 NUL 终止符等。骇人听闻且危险。

退一步说,如果您不得不问这类问题,您应该担心采用好的编程实践 - 只有当您精通此类问题时,您才应该担心关于什么是最佳的。为了养成良好的习惯,您可能需要先了解一下 boost 序列化库并熟悉它。

关于c++ - 动态构造字节数组并返回长度的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361850/

相关文章:

unicode - WireShark - 我可以解码数据包中的 UTF-8 数据吗?

c++ - C++03 中的右值

c++ - std::partition 分隔小于 pivot 的元素的问题

c++ - 内存访问和缓存

mysql - 为什么 Encode::decode ('UTF-8' , $var) 一切都已经在 UTF-8 中时仍然需要?

javascript - 使用encodeURIComponent javascript将带有反斜杠、正斜杠和空格的url参数字符串转换为%5C、%2F和%20

shell - 如何使用lame批量缩减MP3文件采样?

c++ - 位字段的 offsetof 和 sizeof 类似功能

c++ - 枚举类与枚举或类有何相似之处?

python - str.encode 在data的前面加一个 'b'