【发布时间】:2011-08-31 04:41:17
【问题描述】:
将宽字符串转换为 base64 的最佳方法是什么?
【问题讨论】:
标签: c++ base64 widestring
将宽字符串转换为 base64 的最佳方法是什么?
【问题讨论】:
标签: c++ base64 widestring
八位字节(8 位符号)-> Base64(6 位符号)转换适用于字节,而不是字符,因此它的工作方式与字符串编码无关。
需要明确:Base64 不是字符编码。发送方和接收方需要就字符编码(ASCII、UTF-8、UTF-16、UCS-2 等)以及传输方式(Base64、gzip 等)达成一致。
【讨论】:
wchar_t 不是八位字节,您必须在base64 编码之前将宽字符串转换为八位字节数组。
wchar_t* 类型转换为 const char*并编码为 Base64。
void*。 API 一次处理的块的大小完全是一个实现细节,它很可能在内部使用 16 位或 32 位字。 void* 是二进制数据的正确类型(另请参见 fread、memcpy)。
wchar_t 是不可移植的,所以如果你在不同的平台上反转编码,你会得到一个错位的字符串。一些平台有 16 位,其他平台有 32 位 wchar_t。有些是大端或小端。由于wchar_t 不是面向字节的,所以无论API 是否产生类型错误,它都不应该是base64 编码的。
wchar_t。无论如何,Base64 会保留编码。不过,您的 cmets 确实适用于基里尔的回答。但我已经添加到我的答案中以澄清这一点。
要将某些数据编码为 base64,您可以使用 Xerces 库中的 Base64 类。它可能如下所示:
std::wstring input_string = SOME; // some wide string
// keep it in contiguous memory (the following string is not needed in C++0x)
std::vector<wchar_t> raw_str( input_string.begin(), input_string.end() );
XMLSize_t len;
XMLByte* data_encoded = xercesc::Base64::encode( reinterpret_cast<const XMLByte*>(&raw_str[0]), raw_str.size()*sizeof(wchar_t), &len );
XMLCh* text_encoded = xercesc::XMLString::transcode( reinterpret_cast<char*>(data_encoded) );
// here's text_encoded is encoded text
// do some with text_encoded
XMLString::release( &text_encoded );
XMLString::release( reinterpret_cast<char**>(&data_encoded) );
【讨论】:
如果您将 Visual C++ 与 MFC 一起使用,则已经有一个库可以执行此操作。查看Base64Encode 和Base64Decode。
【讨论】: