如何将数字数据序列化为char*

How to serialize numeric data into char*

本文关键字:char 序列化 数据 数字      更新时间:2023-10-16

我需要序列化int, double, long, and float这就是我现在的做法

int value = 42;
char* data = new char[64];
std::sprintf(data, "%d", value);
// check
printf( "%sn", data );

首先,我不确定这是否是最好的方法,但我的直接问题是确定缓冲区的大小。
这个例子中的数字64完全是任意的。我如何知道传递的数字的确切大小,以便分配准确的内存;不超过也不少于要求?

C或c++解决方案都可以。

编辑
根据下面约翰的回答(分配足够大的缓冲区…),我正在考虑这样做

char *data = 0;
int value = 42;
char buffer[999];
std::sprintf(buffer, "%d", value);
data = new char[strlen(buffer)+1];
memcpy(data,buffer,strlen(buffer)+1);
printf( "%sn", data );

以速度为代价避免浪费。并不能完全解决潜在的溢出
或者我可以使用足以表示类型的最大值。

在c++中,你可以使用字符串流,而不用担心缓冲区的大小:

#include <sstream>
...
std::ostringstream os;
int value=42;
os<<42; // you use string streams as regular streams (cout, etc.)
std::string data = os.str(); // now data contains "42"

(如果你想,你可以通过c_str()方法从std::string中得到const char *)


在C中,相反,你可以使用snprintf来"伪造"写操作并获得要分配的缓冲区大小;事实上,如果你传递0作为snprintf的第二个参数,你可以传递NULL作为目标字符串,你得到的字符将被写为返回值。在C中,你可以这样写:

int value = 42;
char * data;
size_t bufSize=snprintf(NULL, 0 "%d", value)+1; /* +1 for the NUL terminator */
data = malloc(bufSize);
if(data==NULL)
{
    // ... handle allocation failure ...
}
snprintf(data, bufSize, "%d", value);
// ...
free(data);

我将序列化到一个'足够大'的缓冲区,然后复制到已分配的缓冲区。在C

char big_buffer[999], *small_buffer;
sprintf(big_buffer, "%d", some_value);
small_buffer = malloc(strlen(big_buffer) + 1);
strcpy(small_buffer, big_buffer);