什么是将宽字符串转换为Base64的最佳方法?
八位字节(8位符号) -> Base64(6位符号)转换是基于字节而不是字符的,因此无论您的字符串编码如何,它都以相同的方式工作。
需要明确的是:Base64不是字符编码。发送方和接收方需要就字符编码(ASCII,UTF-8,UTF-16,UCS-2等)以及传输方法(Base64,gzip等)达成一致。
要将一些数据编码为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) );
Base64Encode
和Base64Decode
。
wchar_t
不是八位字节,因此在进行base64编码之前,您必须将宽字符串转换为八位字节的数组。 - Dietrich Eppvoid*
。API一次处理的块大小完全是实现细节,它很可能在内部使用16位或32位字。void*
是二进制数据的正确类型(也请参见fread
,memcpy
)。 - Ben Voigtwchar_t
不可移植,所以如果在另一个平台上反向编码,你将得到一个损坏的字符串。一些平台有16位,另一些平台有32位的wchar_t
。一些是大端或小端。由于wchar_t
不是按字节定向的,因此无论API是否生成类型错误,都不应该使用Base64编码。 - Dietrich Eppchar16_t
和char32_t
,或者任何包含ASCII范围之外字符的字符串。如果我们慷慨一点,甚至UTF-8也可以符合条件。 - Ben Voigtwchar_t
。当涉及到char16_t
和char32_t
时,使用术语“多字节字符”或“多字节字符串”,这些字符串可以使用宽字符串字面量进行初始化。我从未听说过“宽字符串”这个术语,除了C/C++社区之外,因此我使用C/C++标准中的定义。 - Dietrich Epp