如何将数字数据序列化为char*
How to serialize numeric data into char*
我需要序列化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);
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 我可以通过将类强制转换为 char* 来序列化类吗?
- 如何在结构中序列化unique_ptr<char[]>
- 如何使用序列化读取char*
- C++序列化 - 使用从 char * 到结构的reinterpret_cast
- 序列化/反序列化整型数组为char数组