How do I encode a string to base64 using only boost?

前端 未结 9 996
南方客
南方客 2020-12-04 10:53

I\'m trying to quickly encode a simple ASCII string to base64 (Basic HTTP Authentication using boost::asio) and not paste in any new code code or use any libraries beyond bo

9条回答
  •  有刺的猬
    2020-12-04 11:43

    I modified the Answer 8 because it's not functional on my platform.

    const std::string base64_padding[] = {"", "==","="};
    std::string *m_ArchiveData;
    
    /// \brief  To Base64 string
    bool Base64Encode(string* output) 
    {  
        try
        {
            UInt32 iPadding_Mask = 0;
            typedef boost::archive::iterators::base64_from_binary
                 > Base64EncodeIterator;  
            UInt32 len = m_ArchiveData->size();
            std::stringstream os;
    
            std::copy(Base64EncodeIterator(m_ArchiveData->c_str()), 
                Base64EncodeIterator(m_ArchiveData->c_str()+len), 
                std::ostream_iterator(os));
    
            iPadding_Mask = m_ArchiveData->size() % 3;
            os << base64_padding[iPadding_Pask];
    
            *output = os.str();
            return output->empty() == false;  
        }
        catch (...)
        {
            PLOG_ERROR_DEV("unknown error happens");
            return false;
        }
    }  
    
    /// \brief  From Base64 string
    bool mcsf_data_header_byte_stream_archive::Base64Decode(const std::string *input) 
    {  
        try
        {
            std::stringstream os;
            bool bPaded = false;
            typedef boost::archive::iterators::transform_width, 8, 6> Base64DecodeIterator;  
    
            UInt32 iLength = input->length();
            // Remove the padding characters, cf. https://svn.boost.org/trac/boost/ticket/5629
            if (iLength && (*input)[iLength-1] == '=') {
                bPaded = true;
                --iLength;
                if (iLength && (*input)[iLength - 1] == '=') 
                {
                    --iLength;
                }
            }
            if (iLength == 0)
            {
                return false;
            }
    
            if(bPaded)
            {
                iLength --;
            }
    
            copy(Base64DecodeIterator(input->c_str()) ,
                Base64DecodeIterator(input->c_str()+iLength), 
                ostream_iterator(os)); 
    
            *m_ArchiveData = os.str();
            return m_ArchiveData->empty() == false;
        }
        catch (...)
        {
            PLOG_ERROR_DEV("unknown error happens");
            return false;
        }
    }  
    

提交回复
热议问题