C++ 字节数组及其大小的良好表示

C++ 字节数组及其大小的良好表示,c++,bytearray,C++,Bytearray,您将如何很好地表示字节数组及其大小?我想存储(在主内存或文件中)原始字节数组(无符号字符),其中前2/4字节表示其大小。但在这种阵列上的操作看起来不太好: void func(unsigned char *bytearray) { int size; memcpy(&size, bytearray, sizeof(int)); //rest of operation when we know bytearray size } 我怎样才能避免呢?我想到一个简单的结构: str

您将如何很好地表示字节数组及其大小?我想存储(在主内存或文件中)原始字节数组(无符号字符),其中前2/4字节表示其大小。但在这种阵列上的操作看起来不太好:

void func(unsigned char *bytearray)
{
  int size;
  memcpy(&size, bytearray, sizeof(int));
  //rest of operation when we know bytearray size
}
我怎样才能避免呢?我想到一个简单的结构:

struct bytearray
{
  int size;
  unsigned char *data;
};

bytearray *b = reinterpret_cast<bytearray*>(new unsigned char[10]);
b->data = reinterpret_cast<unsigned char*>(&(b->size) + 1);
struct bytearray
{
  int size;
  unsigned char data[];
};

bytearray *b = reinterpret_cast<bytearray*>(::operator new(sizeof (bytearray) + 10));
b->size = 10;

//...

::operator delete(b);
struct bytearray
{
整数大小;
无符号字符*数据;
};
bytearray*b=重新解释强制转换(新的无符号字符[10]);
b->data=重新解释铸件(&(b->size)+1);

我可以访问bytearray的大小和数据部分。但它看起来还是很难看。你能推荐另一种方法吗?

你正在有效地重新发明新方法。然而

 b->data = reinterpret_cast<unsigned char*>(&(b->size) + 1);
b->data=reinterpret\u cast(&(b->size)+1);
根本不起作用,因为指针指向自身,指针将被覆盖

您应该能够为结构的最后一个元素使用未指定大小的数组:

struct bytearray
{
  int size;
  unsigned char *data;
};

bytearray *b = reinterpret_cast<bytearray*>(new unsigned char[10]);
b->data = reinterpret_cast<unsigned char*>(&(b->size) + 1);
struct bytearray
{
  int size;
  unsigned char data[];
};

bytearray *b = reinterpret_cast<bytearray*>(::operator new(sizeof (bytearray) + 10));
b->size = 10;

//...

::operator delete(b);
struct bytearray
{
整数大小;
无符号字符数据[];
};
bytearray*b=重新解释强制转换(::运算符新建(sizeof(bytearray)+10));
b->size=10;
//...
::操作员删除(b);
std::vector
不同,它实际上将大小和数据存储在一起,因此您可以在一次操作中将其写入文件。并且内存局部性更好


尽管如此,
std::vector
已经过测试,并且为您实现了许多有用的算法,这一事实使它非常有吸引力。

除非您有压倒性的理由这样做,否则,只需做惯用的事情并使用std::vector。

我会使用
std::vector
来管理内存,并编写一个转换函数,在需要时为您创建一些类似于iovec的结构

iovec make_iovec (std::vector<unsigned char> &v) {
    iovec iv = { &v[0], v.size() };
    return iv;
}

为什么不
std::vector
?例如,如果我想将其存储在文件中,那么它就没有那么有效。如果您想询问如何将数据存储在文件中,请执行此操作。但我想,你的问题是如何把它表示为C++类型。“David Schwartz,谢谢。我澄清我的问题。我不关心或不知道底层存储。它可能是一个mmaped文件。您不能在一次操作中将其写入可移植的文件。因为int二进制表示依赖于endianness?或者你还有别的想法?@David:这样做的代码是可移植的。生成的文件是特定于体系结构的(取决于
int
的大小和表示形式),但有许多应用程序只需要将文件加载回同一台计算机上的同一应用程序(例如缓存)。@devwi:例如,编译器可能会也可能不会在
大小
数据
之间放置填充。
int
可能是两个字节、四个字节或其他大小。我可以用#pragma pack(1)处理它。这不是什么大问题。