296 lines
8.2 KiB
C
296 lines
8.2 KiB
C
|
// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
// Redistribution and use in source and binary forms, with or without
|
||
|
// modification, are permitted provided that the following conditions are met:
|
||
|
// * Redistributions of source code must retain the above copyright
|
||
|
// notice, this list of conditions and the following disclaimer.
|
||
|
// * Redistributions in binary form must reproduce the above copyright
|
||
|
// notice, this list of conditions and the following disclaimer in the
|
||
|
// documentation and/or other materials provided with the distribution.
|
||
|
// * Neither the name of the Andrey N. Sabelnikov nor the
|
||
|
// names of its contributors may be used to endorse or promote products
|
||
|
// derived from this software without specific prior written permission.
|
||
|
//
|
||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||
|
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
|
||
|
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
|
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
|
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
//
|
||
|
|
||
|
|
||
|
#ifndef _STRING_CODING_H_
|
||
|
#define _STRING_CODING_H_
|
||
|
|
||
|
#include <string>
|
||
|
//#include "md5_l.h"
|
||
|
namespace epee
|
||
|
{
|
||
|
namespace string_encoding
|
||
|
{
|
||
|
inline std::string convert_to_ansii(const std::wstring& str_from)
|
||
|
{
|
||
|
|
||
|
std::string res(str_from.begin(), str_from.end());
|
||
|
return res;
|
||
|
/*
|
||
|
std::string result;
|
||
|
std::locale loc;
|
||
|
for(unsigned int i= 0; i < str_from.size(); ++i)
|
||
|
{
|
||
|
result += std::use_facet<std::ctype<wchar_t> >(loc).narrow(str_from[i]);
|
||
|
}
|
||
|
return result;
|
||
|
*/
|
||
|
|
||
|
//return boost::lexical_cast<std::string>(str_from);
|
||
|
/*
|
||
|
std::string str_trgt;
|
||
|
if(!str_from.size())
|
||
|
return str_trgt;
|
||
|
int cb = ::WideCharToMultiByte( code_page, 0, str_from.data(), (__int32)str_from.size(), 0, 0, 0, 0 );
|
||
|
if(!cb)
|
||
|
return str_trgt;
|
||
|
str_trgt.resize(cb);
|
||
|
::WideCharToMultiByte( code_page, 0, str_from.data(), (int)str_from.size(),
|
||
|
(char*)str_trgt.data(), (int)str_trgt.size(), 0, 0);
|
||
|
return str_trgt;*/
|
||
|
}
|
||
|
#ifdef WINDOWS_PLATFORM_EX
|
||
|
inline std::string convert_to_ansii_win(const std::wstring& str_from)
|
||
|
{
|
||
|
|
||
|
int code_page = CP_ACP;
|
||
|
std::string str_trgt;
|
||
|
if(!str_from.size())
|
||
|
return str_trgt;
|
||
|
int cb = ::WideCharToMultiByte( code_page, 0, str_from.data(), (__int32)str_from.size(), 0, 0, 0, 0 );
|
||
|
if(!cb)
|
||
|
return str_trgt;
|
||
|
str_trgt.resize(cb);
|
||
|
::WideCharToMultiByte( code_page, 0, str_from.data(), (int)str_from.size(),
|
||
|
(char*)str_trgt.data(), (int)str_trgt.size(), 0, 0);
|
||
|
return str_trgt;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
inline std::string convert_to_ansii(const std::string& str_from)
|
||
|
{
|
||
|
return str_from;
|
||
|
}
|
||
|
|
||
|
inline std::wstring convert_to_unicode(const std::string& str_from)
|
||
|
{
|
||
|
std::wstring result;
|
||
|
std::locale loc;
|
||
|
for(unsigned int i= 0; i < str_from.size(); ++i)
|
||
|
{
|
||
|
result += std::use_facet<std::ctype<wchar_t> >(loc).widen(str_from[i]);
|
||
|
}
|
||
|
return result;
|
||
|
|
||
|
//return boost::lexical_cast<std::wstring>(str_from);
|
||
|
/*
|
||
|
std::wstring str_trgt;
|
||
|
if(!str_from.size())
|
||
|
return str_trgt;
|
||
|
|
||
|
int cb = ::MultiByteToWideChar( code_page, 0, str_from.data(), (int)str_from.size(), 0, 0 );
|
||
|
if(!cb)
|
||
|
return str_trgt;
|
||
|
|
||
|
str_trgt.resize(cb);
|
||
|
::MultiByteToWideChar( code_page, 0, str_from.data(),(int)str_from.size(),
|
||
|
(wchar_t*)str_trgt.data(),(int)str_trgt.size());
|
||
|
return str_trgt;*/
|
||
|
}
|
||
|
inline std::wstring convert_to_unicode(const std::wstring& str_from)
|
||
|
{
|
||
|
return str_from;
|
||
|
}
|
||
|
|
||
|
template<class target_string>
|
||
|
inline target_string convert_to_t(const std::wstring& str_from);
|
||
|
|
||
|
template<>
|
||
|
inline std::string convert_to_t<std::string>(const std::wstring& str_from)
|
||
|
{
|
||
|
return convert_to_ansii(str_from);
|
||
|
}
|
||
|
|
||
|
template<>
|
||
|
inline std::wstring convert_to_t<std::wstring>(const std::wstring& str_from)
|
||
|
{
|
||
|
return str_from;
|
||
|
}
|
||
|
|
||
|
template<class target_string>
|
||
|
inline target_string convert_to_t(const std::string& str_from);
|
||
|
|
||
|
template<>
|
||
|
inline std::string convert_to_t<std::string>(const std::string& str_from)
|
||
|
{
|
||
|
return str_from;
|
||
|
}
|
||
|
|
||
|
template<>
|
||
|
inline std::wstring convert_to_t<std::wstring>(const std::string& str_from)
|
||
|
{
|
||
|
return convert_to_unicode(str_from);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
std::string& base64_chars()
|
||
|
{
|
||
|
|
||
|
static std::string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||
|
"abcdefghijklmnopqrstuvwxyz"
|
||
|
"0123456789+/";
|
||
|
|
||
|
return chars;
|
||
|
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len) {
|
||
|
std::string ret;
|
||
|
int i = 0;
|
||
|
int j = 0;
|
||
|
unsigned char char_array_3[3];
|
||
|
unsigned char char_array_4[4];
|
||
|
|
||
|
while (in_len--) {
|
||
|
char_array_3[i++] = *(bytes_to_encode++);
|
||
|
if (i == 3) {
|
||
|
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||
|
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||
|
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||
|
char_array_4[3] = char_array_3[2] & 0x3f;
|
||
|
|
||
|
for(i = 0; (i <4) ; i++)
|
||
|
ret += base64_chars()[char_array_4[i]];
|
||
|
i = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (i)
|
||
|
{
|
||
|
for(j = i; j < 3; j++)
|
||
|
char_array_3[j] = '\0';
|
||
|
|
||
|
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||
|
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||
|
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||
|
char_array_4[3] = char_array_3[2] & 0x3f;
|
||
|
|
||
|
for (j = 0; (j < i + 1); j++)
|
||
|
ret += base64_chars()[char_array_4[j]];
|
||
|
|
||
|
while((i++ < 3))
|
||
|
ret += '=';
|
||
|
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
std::string base64_encode(const std::string& str)
|
||
|
{
|
||
|
return base64_encode((unsigned char const* )str.data(), str.size());
|
||
|
}
|
||
|
|
||
|
inline bool is_base64(unsigned char c) {
|
||
|
return (isalnum(c) || (c == '+') || (c == '/'));
|
||
|
}
|
||
|
|
||
|
|
||
|
inline
|
||
|
std::string base64_decode(std::string const& encoded_string) {
|
||
|
size_t in_len = encoded_string.size();
|
||
|
size_t i = 0;
|
||
|
size_t j = 0;
|
||
|
size_t in_ = 0;
|
||
|
unsigned char char_array_4[4], char_array_3[3];
|
||
|
std::string ret;
|
||
|
|
||
|
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
|
||
|
char_array_4[i++] = encoded_string[in_]; in_++;
|
||
|
if (i ==4) {
|
||
|
for (i = 0; i <4; i++)
|
||
|
char_array_4[i] = (unsigned char)base64_chars().find(char_array_4[i]);
|
||
|
|
||
|
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||
|
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||
|
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||
|
|
||
|
for (i = 0; (i < 3); i++)
|
||
|
ret += char_array_3[i];
|
||
|
i = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (i) {
|
||
|
for (j = i; j <4; j++)
|
||
|
char_array_4[j] = 0;
|
||
|
|
||
|
for (j = 0; j <4; j++)
|
||
|
char_array_4[j] = (unsigned char)base64_chars().find(char_array_4[j]);
|
||
|
|
||
|
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||
|
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||
|
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||
|
|
||
|
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
//md5
|
||
|
#ifdef MD5_H
|
||
|
inline
|
||
|
std::string get_buf_as_hex_string(const void* pbuf, size_t len)
|
||
|
{
|
||
|
std::ostringstream result;
|
||
|
|
||
|
const unsigned char* p_buff = (const unsigned char*)pbuf;
|
||
|
|
||
|
for(unsigned int i=0;i<len;i++)
|
||
|
{ // convert md to hex-represented string (hex-letters in upper case!)
|
||
|
result << std::setw(2) << std::setfill('0')
|
||
|
<< std::setbase(16) << std::nouppercase
|
||
|
<< (int)*p_buff++;
|
||
|
}
|
||
|
|
||
|
return result.str();
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
std::string get_md5_as_hexstring(const void* pbuff, size_t len)
|
||
|
{
|
||
|
unsigned char output[16] = {0};
|
||
|
md5::md5((unsigned char*)pbuff, static_cast<unsigned int>(len), output);
|
||
|
return get_buf_as_hex_string(output, sizeof(output));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
std::string get_md5_as_hexstring(const std::string& src)
|
||
|
{
|
||
|
return get_md5_as_hexstring(src.data(), src.size());
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif //_STRING_CODING_H_
|