gpt4 book ai didi

c++ - 在 C++ 中将可变参数列表序列化为字节数组的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:48 25 4
gpt4 key购买 nike

我有一个 C 实现,其中我将参数的变量列表序列化为字节数组。因此我可以将一定数量的变量保存到一个文件中。

C 中的代码如下所示:

static uint8_t byte_array[1024];

/* In this example, we assume that fmt contains only 'c', 'i', or 'f'
We also assume that an argument is available for each char in fmt.
*/

uint8_t * serialize_args(const char *fmt, ...) {
char *ptr = fmt;
uint32_t idx = 0;
va_list args;
va_start(args, fmt);

while(*ptr != NULL) {
char p = *ptr++;
char c;
int i;
float f;

switch(p) {
case 'c': /* serialize char */
c = va_arg(args, int32_t);
byte_array[idx++] = (uint8_t) c;
break;
case 'i': /* serialize int */
i = va_arg(args, int32_t);
memcpy(&byte_array[idx], &i, sizeof i);
idx += sizeof i;
break;
case 'f': /* serialize float */
f = (float)va_arg(args, double);
memcpy(&byte_array[idx], &f, sizeof f);
idx += sizeof f;
break;
}
}
va_end(args, fmt);

byte_array[idx++] = 0;
return byte_array;
}

现在假设我想用 C++ 翻译它。什么容器最适合? vector ?我会看起来像这样:

vector<uint8_t> serialize_args(const char *fmt, ...) {
char *ptr = fmt;

vector<uint8_t> byte_array;

va_list args;
va_start(args, fmt);

while(*ptr != NULL) {
char p = *ptr++;
char c;
int i;
float f;

switch(p) {
case 'c': // serialize char
c = (char)va_arg(args, int32_t);
byte_array.push_back(c); // do I need a cast ?
break;
case 'i': // serialize int
i = va_arg(args, int32_t);
// here how do I memcpy to a vector ?
break;
case 'f': // serialize float
f = (float)va_arg(args, double);
// here how do I memcpy to a vector ?
break;
}
}

va_end(args, fmt);

return byte_array;
}

有什么建议吗?

最佳答案

使用指向字符类型的指针为任何类型起别名是合法的,因此您可以执行以下操作(以及 int 的示例):

for (unsigned char* p = &i; p != &i+sizeof(int); ++p)
byte_array.push_back(*p);

或者,也许更地道:

std::copy(&i, &i + sizeof(int), std::back_inserter(byte_array));

您还可以使用 memcpy , 但你需要为 sizeof(int) 腾出空间预先使用 vector 的字节 resize方法。

在 C++11 中,您将完全摆脱可变参数并使用可变参数模板函数。

关于c++ - 在 C++ 中将可变参数列表序列化为字节数组的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19514601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com