gpt4 book ai didi

c++ - 将二进制对象读/写为十六进制?

转载 作者:行者123 更新时间:2023-11-30 04:16:55 24 4
gpt4 key购买 nike

我需要将各种结构序列化到一个文件中。如果可能的话,我希望文件是纯 ASCII 码。我可以为每个结构编写某种类型的序列化器,但有数百个和许多包含我想准确表示的 floatdouble

我不能使用第三方序列化库,也没有时间编写数百个序列化程序。

如何以 ASCII 安全方式序列化此数据?也请使用流,我讨厌 C 风格的 printf("%02x",data) 的外观。

最佳答案

我在网上找到了这个解决方案,它解决了这个问题:

https://jdale88.wordpress.com/2009/09/24/c-anything-tofrom-a-hex-string/

转载如下:

#include <string>
#include <sstream>
#include <iomanip>


// ------------------------------------------------------------------
/*!
Convert a block of data to a hex string
*/
void toHex(
void *const data, //!< Data to convert
const size_t dataLength, //!< Length of the data to convert
std::string &dest //!< Destination string
)
{
unsigned char *byteData = reinterpret_cast<unsigned char*>(data);
std::stringstream hexStringStream;

hexStringStream << std::hex << std::setfill('0');
for(size_t index = 0; index < dataLength; ++index)
hexStringStream << std::setw(2) << static_cast<int>(byteData[index]);
dest = hexStringStream.str();
}


// ------------------------------------------------------------------
/*!
Convert a hex string to a block of data
*/
void fromHex(
const std::string &in, //!< Input hex string
void *const data //!< Data store
)
{
size_t length = in.length();
unsigned char *byteData = reinterpret_cast<unsigned char*>(data);

std::stringstream hexStringStream; hexStringStream >> std::hex;
for(size_t strIndex = 0, dataIndex = 0; strIndex < length; ++dataIndex)
{
// Read out and convert the string two characters at a time
const char tmpStr[3] = { in[strIndex++], in[strIndex++], 0 };

// Reset and fill the string stream
hexStringStream.clear();
hexStringStream.str(tmpStr);

// Do the conversion
int tmpValue = 0;
hexStringStream >> tmpValue;
byteData[dataIndex] = static_cast<unsigned char>(tmpValue);
}
}

这可以很容易地适应文件流的读/写,尽管 fromHex 中使用的 stringstream 仍然是必需的,转换必须一次完成两个读取字符时间。

关于c++ - 将二进制对象读/写为十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17452689/

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