【问题标题】:C++ how convert wide string to base64?C ++如何将宽字符串转换为base64?
【发布时间】:2011-08-31 04:41:17
【问题描述】:

将宽字符串转换为 base64 的最佳方法是什么?

【问题讨论】:

    标签: c++ base64 widestring


    【解决方案1】:

    八位字节(8 位符号)-> Base64(6 位符号)转换适用于字节,而不是字符,因此它的工作方式与字符串编码无关。


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

    【讨论】:

    • 澄清一下,由于wchar_t 不是八位字节,您必须在base64 编码之前将宽字符串转换为八位字节数组。
    • 为了进一步澄清,您需要决定是在编码为 Base64 之前将宽字符串转换为像 UTF-8 这样的中间形式,还是跳过它,将 wchar_t* 类型转换为 const char*并编码为 Base64。
    • @Dietrich, @Mike:设计良好的转换 API 将采用 void*。 API 一次处理的块的大小完全是一个实现细节,它很可能在内部使用 16 位或 32 位字。 void* 是二进制数据的正确类型(另请参见 fread、memcpy)。
    • @Ben Voigt:但是wchar_t 是不可移植的,所以如果你在不同的平台上反转编码,你会得到一个错位的字符串。一些平台有 16 位,其他平台有 32 位 wchar_t。有些是大端或小端。由于wchar_t 不是面向字节的,所以无论API 是否产生类型错误,它都不应该是base64 编码的。
    • @Dietrich:没错,但除了你之外没有人在谈论wchar_t。无论如何,Base64 会保留编码。不过,您的 cmets 确实适用于基里尔的回答。但我已经添加到我的答案中以澄清这一点。
    【解决方案2】:

    要将某些数据编码为 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等中间形式的解决方案。
    • 非常有用的代码展示了如何释放 xercesc 分配的内存
    【解决方案3】:

    如果您将 Visual C++ 与 MFC 一起使用,则已经有一个库可以执行此操作。查看Base64Encode 和Base64Decode。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2022-11-12
      相关资源
      最近更新 更多