C++如何将宽字符串转换为base64?

3
什么是将宽字符串转换为Base64的最佳方法?
3个回答

6

八位字节(8位符号) -> Base64(6位符号)转换是基于字节而不是字符的,因此无论您的字符串编码如何,它都以相同的方式工作。


需要明确的是:Base64不是字符编码。发送方和接收方需要就字符编码(ASCII,UTF-8,UTF-16,UCS-2等)以及传输方法(Base64,gzip等)达成一致。


1
澄清一下,由于wchar_t不是八位字节,因此在进行base64编码之前,您必须将宽字符串转换为八位字节的数组。 - Dietrich Epp
@Dietrich,@Mike:一个设计良好的转换API应该采用void*。API一次处理的块大小完全是实现细节,它很可能在内部使用16位或32位字。void*是二进制数据的正确类型(也请参见freadmemcpy)。 - Ben Voigt
@Ben Voigt:但是wchar_t不可移植,所以如果在另一个平台上反向编码,你将得到一个损坏的字符串。一些平台有16位,另一些平台有32位的wchar_t。一些是大端或小端。由于wchar_t不是按字节定向的,因此无论API是否生成类型错误,都不应该使用Base64编码。 - Dietrich Epp
@Dietrich:这可能意味着char16_tchar32_t,或者任何包含ASCII范围之外字符的字符串。如果我们慷慨一点,甚至UTF-8也可以符合条件。 - Ben Voigt
@Ben:“宽字符串”在相关标准中被定义为一系列宽字符。 “宽字符”被定义为wchar_t。当涉及到char16_tchar32_t时,使用术语“多字节字符”或“多字节字符串”,这些字符串可以使用宽字符串字面量进行初始化。我从未听说过“宽字符串”这个术语,除了C/C++社区之外,因此我使用C/C++标准中的定义。 - Dietrich Epp
显示剩余3条评论

1

要将一些数据编码为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) );

这是一种不使用中间形式(如UTF-8)的解决方案。 - Mike DeSimone
非常有用的代码,展示了如何释放由xercesc分配的内存。 - Damian

0
如果您正在使用带有MFC的Visual C++,那么已经有一个库可以完成这个任务。请查看Base64EncodeBase64Decode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接