mirror of
https://github.com/celisej567/mcpe.git
synced 2026-01-03 05:49:04 +03:00
96 lines
4.0 KiB
C++
96 lines
4.0 KiB
C++
/*
|
|
* Copyright (c) 2014, Oculus VR, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
#include "Base64Encoder.h"
|
|
#include "RakMemoryOverride.h"
|
|
|
|
const char *Base64Map(void) {return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";}
|
|
const char *base64Map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
// 3/17/2013 must be unsigned char or else it will use negative indices
|
|
int Base64Encoding(const unsigned char *inputData, int dataLength, char *outputData)
|
|
{
|
|
// http://en.wikipedia.org/wiki/Base64
|
|
|
|
int outputOffset, charCount;
|
|
int write3Count;
|
|
outputOffset=0;
|
|
charCount=0;
|
|
int j;
|
|
|
|
write3Count=dataLength/3;
|
|
for (j=0; j < write3Count; j++)
|
|
{
|
|
// 6 leftmost bits from first byte, shifted to bits 7,8 are 0
|
|
outputData[outputOffset++]=base64Map[inputData[j*3+0] >> 2];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8
|
|
outputData[outputOffset++]=base64Map[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// 4 low bits from the second byte and the two high bits from the third byte, masked to ignore bits 7,8
|
|
outputData[outputOffset++]=base64Map[((inputData[j*3+1] << 2) | (inputData[j*3+2] >> 6)) & 63]; // Third 6 bits
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Last 6 bits from the third byte, masked to ignore bits 7,8
|
|
outputData[outputOffset++]=base64Map[inputData[j*3+2] & 63];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
}
|
|
|
|
if (dataLength % 3==1)
|
|
{
|
|
// One input byte remaining
|
|
outputData[outputOffset++]=base64Map[inputData[j*3+0] >> 2];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8
|
|
outputData[outputOffset++]=base64Map[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Pad with two equals
|
|
outputData[outputOffset++]='=';
|
|
outputData[outputOffset++]='=';
|
|
}
|
|
else if (dataLength % 3==2)
|
|
{
|
|
// Two input bytes remaining
|
|
|
|
// 6 leftmost bits from first byte, shifted to bits 7,8 are 0
|
|
outputData[outputOffset++]=base64Map[inputData[j*3+0] >> 2];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8
|
|
outputData[outputOffset++]=base64Map[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63];
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// 4 low bits from the second byte, followed by 00
|
|
outputData[outputOffset++]=base64Map[(inputData[j*3+1] << 2) & 63]; // Third 6 bits
|
|
if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;}
|
|
|
|
// Pad with one equal
|
|
outputData[outputOffset++]='=';
|
|
//outputData[outputOffset++]='=';
|
|
}
|
|
|
|
// Append \r\n
|
|
outputData[outputOffset++]='\r';
|
|
outputData[outputOffset++]='\n';
|
|
outputData[outputOffset]=0;
|
|
|
|
return outputOffset;
|
|
}
|
|
|
|
int Base64Encoding(const unsigned char *inputData, int dataLength, char **outputData)
|
|
{
|
|
*outputData = (char*) rakMalloc_Ex(dataLength * 2 + 6, _FILE_AND_LINE_);
|
|
return Base64Encoding(inputData, dataLength, *outputData);
|
|
}
|