我需要在类中创建一个编码器函数
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。
问题,
我应该如何分配内存?因为调用这个函数之前不知道
有没有一种映射类对象内存的方法,基本上可以满足我的需求。
我知道这是一个非常基本的问题,但想知道最佳和常规的方法。
最佳答案
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.
这很含糊。如果您使用(可能是特定于编译器的)#pragma
或 attribute 来确保字符值在内存中占用 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/