그래 카스 :
여기 있습니다. 즐겨!
#include <iostream>
#include <string>
struct BASE64_DEC_TABLE {
signed char n[256];
BASE64_DEC_TABLE() {
for(int i=0; i<256; ++i) n[i] = -1;
for(unsigned char i='0'; i<='9'; ++i) n[i] = 52+i-'0';
for(unsigned char i='A'; i<='Z'; ++i) n[i] = i-'A';
for(unsigned char i='a'; i<='z'; ++i) n[i] = 26+i-'a';
n['+'] = 62;
n['/'] = 63;
}
int operator [] (unsigned char i) const { return n[i]; }
};
size_t Base64Decode(const std::string& source, void* pdest, size_t dest_size) {
static const BASE64_DEC_TABLE b64table;
if(!dest_size) return 0;
const size_t len = source.length();
int bc=0, a=0;
char* const pstart = static_cast<char*>(pdest);
char* pd = pstart;
char* const pend = pd + dest_size;
for(size_t i=0; i<len; ++i) {
const int n = b64table[source[i]];
if(n == -1) continue;
a |= (n & 63) << (18 - bc);
if((bc += 6) > 18) {
*pd = a >> 16; if(++pd >= pend) return pd - pstart;
*pd = a >> 8; if(++pd >= pend) return pd - pstart;
*pd = a; if(++pd >= pend) return pd - pstart;
bc = a = 0;
} }
if(bc >= 8) {
*pd = a >> 16; if(++pd >= pend) return pd - pstart;
if(bc >= 16) *(pd++) = a >> 8;
}
return pd - pstart;
}
int main() {
std::string base64_string = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=";
unsigned char decoded_data[32] = {0};
Base64Decode(base64_string, decoded_data, sizeof(decoded_data));
for(auto b : decoded_data) {
std::cout << static_cast<unsigned>(b) << ' ';
}
std::cout << std::endl;
return 0;
}
변환 할 필요가 없습니다. 그베이스는 이미'unsigned char *'이며, 디자인 상'unsigned char const *'로 사용할 수 있습니다. 'var'을'unsigned char const * '매개 변수로 전달하는 것은 문제가 없습니다. 여기서'var'는'unsigned char var [32];로 선언되고 바이너리 키/서명으로 올바르게로드됩니다. – WhozCraig
Ah. 그것은 훨씬 더 의미가 있습니다. 벌써 Base64 인 코드/디코드 구현이 많이 있습니다. 일반적으로 암호화 API에는 Microsoft CryptoAPI와 OpenSSL이 있습니다. 합리적인 구현 [당신을 위해 일할 수도 있습니다] (http://base64.sourceforge.net/b64.c)를 찾고 있다면. 파일이 아니라 벡터 또는 플랫 어레이에서 데이터를 제공하는 것은 그리 어렵지 않습니다. – WhozCraig
만약'std :: string'이라면 단순히'c_str()'과'length()'문자열을 전달하는 base64 디코드 알고리즘을 사용할 수 있어야합니다. 궁극적으로는 결국 모든 문자열 - 바이트 또는 바이트 - 문자열입니다. – WhozCraig